@atlaskit/editor-plugin-block-menu 0.0.13 → 0.0.14
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/CHANGELOG.md +6 -0
- package/dist/cjs/blockMenuPlugin.js +6 -0
- package/dist/cjs/editor-commands/formatNode.js +23 -0
- package/dist/cjs/editor-commands/transforms/block-transforms.js +37 -0
- package/dist/cjs/editor-commands/transforms/container-transforms.js +59 -0
- package/dist/cjs/editor-commands/transforms/list-transforms.js +53 -0
- package/dist/cjs/editor-commands/transforms/transformNodeToTargetType.js +50 -0
- package/dist/cjs/editor-commands/transforms/types.js +5 -0
- package/dist/cjs/editor-commands/transforms/utils.js +109 -0
- package/dist/es2019/blockMenuPlugin.js +6 -0
- package/dist/es2019/editor-commands/formatNode.js +20 -0
- package/dist/es2019/editor-commands/transforms/block-transforms.js +38 -0
- package/dist/es2019/editor-commands/transforms/container-transforms.js +55 -0
- package/dist/es2019/editor-commands/transforms/list-transforms.js +49 -0
- package/dist/es2019/editor-commands/transforms/transformNodeToTargetType.js +48 -0
- package/dist/es2019/editor-commands/transforms/types.js +1 -0
- package/dist/es2019/editor-commands/transforms/utils.js +103 -0
- package/dist/esm/blockMenuPlugin.js +6 -0
- package/dist/esm/editor-commands/formatNode.js +17 -0
- package/dist/esm/editor-commands/transforms/block-transforms.js +32 -0
- package/dist/esm/editor-commands/transforms/container-transforms.js +54 -0
- package/dist/esm/editor-commands/transforms/list-transforms.js +48 -0
- package/dist/esm/editor-commands/transforms/transformNodeToTargetType.js +44 -0
- package/dist/esm/editor-commands/transforms/types.js +1 -0
- package/dist/esm/editor-commands/transforms/utils.js +103 -0
- package/dist/types/blockMenuPluginType.d.ts +6 -1
- package/dist/types/editor-commands/formatNode.d.ts +9 -0
- package/dist/types/editor-commands/transforms/block-transforms.d.ts +5 -0
- package/dist/types/editor-commands/transforms/container-transforms.d.ts +17 -0
- package/dist/types/editor-commands/transforms/list-transforms.d.ts +17 -0
- package/dist/types/editor-commands/transforms/transformNodeToTargetType.d.ts +4 -0
- package/dist/types/editor-commands/transforms/types.d.ts +11 -0
- package/dist/types/editor-commands/transforms/utils.d.ts +12 -0
- package/dist/types-ts4.5/blockMenuPluginType.d.ts +6 -1
- package/dist/types-ts4.5/editor-commands/formatNode.d.ts +9 -0
- package/dist/types-ts4.5/editor-commands/transforms/block-transforms.d.ts +5 -0
- package/dist/types-ts4.5/editor-commands/transforms/container-transforms.d.ts +17 -0
- package/dist/types-ts4.5/editor-commands/transforms/list-transforms.d.ts +17 -0
- package/dist/types-ts4.5/editor-commands/transforms/transformNodeToTargetType.d.ts +4 -0
- package/dist/types-ts4.5/editor-commands/transforms/types.d.ts +11 -0
- package/dist/types-ts4.5/editor-commands/transforms/utils.d.ts +12 -0
- package/package.json +5 -8
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
exports.blockMenuPlugin = void 0;
|
|
8
8
|
var _react = _interopRequireDefault(require("react"));
|
|
9
9
|
var _editorActions = require("./editor-actions");
|
|
10
|
+
var _formatNode2 = require("./editor-commands/formatNode");
|
|
10
11
|
var _main = require("./pm-plugins/main");
|
|
11
12
|
var _blockMenu = _interopRequireDefault(require("./ui/block-menu"));
|
|
12
13
|
var _blockMenuComponents = require("./ui/block-menu-components");
|
|
@@ -34,6 +35,11 @@ var blockMenuPlugin = exports.blockMenuPlugin = function blockMenuPlugin(_ref) {
|
|
|
34
35
|
return registry.components;
|
|
35
36
|
}
|
|
36
37
|
},
|
|
38
|
+
commands: {
|
|
39
|
+
formatNode: function formatNode(currentNode, targetType) {
|
|
40
|
+
return (0, _formatNode2.formatNode)(currentNode, targetType);
|
|
41
|
+
}
|
|
42
|
+
},
|
|
37
43
|
contentComponent: function contentComponent(_ref2) {
|
|
38
44
|
var editorView = _ref2.editorView,
|
|
39
45
|
popupsMountPoint = _ref2.popupsMountPoint,
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.formatNode = void 0;
|
|
7
|
+
var _transformNodeToTargetType = require("./transforms/transformNodeToTargetType");
|
|
8
|
+
/**
|
|
9
|
+
* Formats the current node or selection to the specified target type
|
|
10
|
+
* @param currentNode - The current node
|
|
11
|
+
* @param targetType - The target node type to convert to
|
|
12
|
+
*/
|
|
13
|
+
var formatNode = exports.formatNode = function formatNode(currentNode, targetType) {
|
|
14
|
+
return function (_ref) {
|
|
15
|
+
var tr = _ref.tr;
|
|
16
|
+
var selection = tr.selection;
|
|
17
|
+
try {
|
|
18
|
+
return (0, _transformNodeToTargetType.transformNodeToTargetType)(tr, currentNode, selection.from, targetType);
|
|
19
|
+
} catch (e) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.transformBlockNode = void 0;
|
|
7
|
+
var _containerTransforms = require("./container-transforms");
|
|
8
|
+
var _listTransforms = require("./list-transforms");
|
|
9
|
+
var _utils = require("./utils");
|
|
10
|
+
/**
|
|
11
|
+
* Transform block nodes (paragraph, heading, codeblock)
|
|
12
|
+
*/
|
|
13
|
+
var transformBlockNode = exports.transformBlockNode = function transformBlockNode(context) {
|
|
14
|
+
var tr = context.tr,
|
|
15
|
+
targetNodeType = context.targetNodeType,
|
|
16
|
+
targetAttrs = context.targetAttrs;
|
|
17
|
+
var selection = tr.selection;
|
|
18
|
+
var $from = selection.$from,
|
|
19
|
+
$to = selection.$to;
|
|
20
|
+
|
|
21
|
+
// Handle transformation to list types
|
|
22
|
+
if ((0, _utils.isListNodeType)(targetNodeType)) {
|
|
23
|
+
return (0, _listTransforms.transformToList)();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Handle transformation to container types (panel, expand, blockquote)
|
|
27
|
+
if ((0, _utils.isContainerNodeType)(targetNodeType)) {
|
|
28
|
+
return (0, _containerTransforms.transformToContainer)();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Handle block type transformation (paragraph, heading, codeblock)
|
|
32
|
+
if ((0, _utils.isBlockNodeType)(targetNodeType)) {
|
|
33
|
+
tr.setBlockType($from.pos, $to.pos, targetNodeType, targetAttrs);
|
|
34
|
+
return tr;
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.unwrapAndConvertToList = exports.unwrapAndConvertToBlockType = exports.transformToContainer = exports.transformContainerNode = void 0;
|
|
7
|
+
var _utils = require("./utils");
|
|
8
|
+
/**
|
|
9
|
+
* Transform selection to container type
|
|
10
|
+
*/
|
|
11
|
+
var transformToContainer = exports.transformToContainer = function transformToContainer() {
|
|
12
|
+
return null;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Transform container nodes (panel, expand, blockquote)
|
|
17
|
+
*/
|
|
18
|
+
var transformContainerNode = exports.transformContainerNode = function transformContainerNode(_ref) {
|
|
19
|
+
var tr = _ref.tr,
|
|
20
|
+
sourcePos = _ref.sourcePos,
|
|
21
|
+
targetNodeType = _ref.targetNodeType,
|
|
22
|
+
targetAttrs = _ref.targetAttrs;
|
|
23
|
+
if (sourcePos === null) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Transform container to block type - unwrap and convert content
|
|
28
|
+
if ((0, _utils.isBlockNodeType)(targetNodeType)) {
|
|
29
|
+
return unwrapAndConvertToBlockType();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Transform container to list type
|
|
33
|
+
if ((0, _utils.isListNodeType)(targetNodeType)) {
|
|
34
|
+
return unwrapAndConvertToList();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Transform between container types
|
|
38
|
+
if ((0, _utils.isContainerNodeType)(targetNodeType)) {
|
|
39
|
+
tr.setNodeMarkup(sourcePos, targetNodeType, targetAttrs);
|
|
40
|
+
return tr;
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Unwrap container node and convert content to block type
|
|
47
|
+
*/
|
|
48
|
+
var unwrapAndConvertToBlockType = exports.unwrapAndConvertToBlockType = function unwrapAndConvertToBlockType() {
|
|
49
|
+
// Convert to block type directly
|
|
50
|
+
return null;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Unwrap container node and convert content to list
|
|
55
|
+
*/
|
|
56
|
+
var unwrapAndConvertToList = exports.unwrapAndConvertToList = function unwrapAndConvertToList() {
|
|
57
|
+
// Convert to list directly
|
|
58
|
+
return null;
|
|
59
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.transformToList = exports.transformListNode = exports.transformBetweenListTypes = exports.liftListToBlockType = void 0;
|
|
7
|
+
var _utils = require("./utils");
|
|
8
|
+
/**
|
|
9
|
+
* Transform selection to list type
|
|
10
|
+
*/
|
|
11
|
+
var transformToList = exports.transformToList = function transformToList() {
|
|
12
|
+
return null;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Transform list nodes
|
|
17
|
+
*/
|
|
18
|
+
var transformListNode = exports.transformListNode = function transformListNode(_ref) {
|
|
19
|
+
var targetNodeType = _ref.targetNodeType;
|
|
20
|
+
// Transform list to block type
|
|
21
|
+
if ((0, _utils.isBlockNodeType)(targetNodeType)) {
|
|
22
|
+
// Lift list items out of the list and convert to target block type
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Transform list to container type
|
|
27
|
+
if ((0, _utils.isContainerNodeType)(targetNodeType)) {
|
|
28
|
+
// Lift list items out of the list and convert to container type
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Transform between list types
|
|
33
|
+
if ((0, _utils.isListNodeType)(targetNodeType)) {
|
|
34
|
+
// Lift list items out of the list and convert to the other list type
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
return null;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Lift list content and convert to block type
|
|
42
|
+
*/
|
|
43
|
+
var liftListToBlockType = exports.liftListToBlockType = function liftListToBlockType() {
|
|
44
|
+
// Convert to target block type directly
|
|
45
|
+
return null;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Transform between different list types
|
|
50
|
+
*/
|
|
51
|
+
var transformBetweenListTypes = exports.transformBetweenListTypes = function transformBetweenListTypes() {
|
|
52
|
+
return null;
|
|
53
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.transformNodeToTargetType = transformNodeToTargetType;
|
|
7
|
+
var _blockTransforms = require("./block-transforms");
|
|
8
|
+
var _containerTransforms = require("./container-transforms");
|
|
9
|
+
var _listTransforms = require("./list-transforms");
|
|
10
|
+
var _utils = require("./utils");
|
|
11
|
+
function transformNodeToTargetType(tr, sourceNode, sourcePos, targetType) {
|
|
12
|
+
var nodes = tr.doc.type.schema.nodes;
|
|
13
|
+
var targetNodeInfo = (0, _utils.getTargetNodeInfo)(targetType, nodes);
|
|
14
|
+
if (!targetNodeInfo) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
var targetNodeType = targetNodeInfo.nodeType,
|
|
18
|
+
targetAttrs = targetNodeInfo.attrs;
|
|
19
|
+
|
|
20
|
+
// Early return if trying to transform to the same type
|
|
21
|
+
if (sourceNode.type === targetNodeType) {
|
|
22
|
+
return tr; // No transformation needed
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Prepare transformation context
|
|
26
|
+
var transformationContext = {
|
|
27
|
+
tr: tr,
|
|
28
|
+
sourceNode: sourceNode,
|
|
29
|
+
sourcePos: sourcePos,
|
|
30
|
+
targetNodeType: targetNodeType,
|
|
31
|
+
targetAttrs: targetAttrs
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// Route to appropriate transformation strategy based on source node type
|
|
35
|
+
try {
|
|
36
|
+
if ((0, _utils.isBlockNode)(sourceNode)) {
|
|
37
|
+
return (0, _blockTransforms.transformBlockNode)(transformationContext);
|
|
38
|
+
}
|
|
39
|
+
if ((0, _utils.isListNode)(sourceNode)) {
|
|
40
|
+
return (0, _listTransforms.transformListNode)(transformationContext);
|
|
41
|
+
}
|
|
42
|
+
if ((0, _utils.isContainerNode)(sourceNode)) {
|
|
43
|
+
return (0, _containerTransforms.transformContainerNode)(transformationContext);
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
} catch (e) {
|
|
47
|
+
// Node transformation failed
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.isListNodeType = exports.isListNode = exports.isContainerNodeType = exports.isContainerNode = exports.isBlockNodeType = exports.isBlockNode = exports.getTargetNodeInfo = void 0;
|
|
7
|
+
var getTargetNodeInfo = exports.getTargetNodeInfo = function getTargetNodeInfo(targetType, nodes) {
|
|
8
|
+
switch (targetType) {
|
|
9
|
+
case 'heading1':
|
|
10
|
+
return {
|
|
11
|
+
nodeType: nodes.heading,
|
|
12
|
+
attrs: {
|
|
13
|
+
level: 1
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
case 'heading2':
|
|
17
|
+
return {
|
|
18
|
+
nodeType: nodes.heading,
|
|
19
|
+
attrs: {
|
|
20
|
+
level: 2
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
case 'heading3':
|
|
24
|
+
return {
|
|
25
|
+
nodeType: nodes.heading,
|
|
26
|
+
attrs: {
|
|
27
|
+
level: 3
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
case 'heading4':
|
|
31
|
+
return {
|
|
32
|
+
nodeType: nodes.heading,
|
|
33
|
+
attrs: {
|
|
34
|
+
level: 4
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
case 'heading5':
|
|
38
|
+
return {
|
|
39
|
+
nodeType: nodes.heading,
|
|
40
|
+
attrs: {
|
|
41
|
+
level: 5
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
case 'heading6':
|
|
45
|
+
return {
|
|
46
|
+
nodeType: nodes.heading,
|
|
47
|
+
attrs: {
|
|
48
|
+
level: 6
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
case 'paragraph':
|
|
52
|
+
return {
|
|
53
|
+
nodeType: nodes.paragraph
|
|
54
|
+
};
|
|
55
|
+
case 'blockquote':
|
|
56
|
+
return {
|
|
57
|
+
nodeType: nodes.blockquote
|
|
58
|
+
};
|
|
59
|
+
case 'expand':
|
|
60
|
+
return {
|
|
61
|
+
nodeType: nodes.expand
|
|
62
|
+
};
|
|
63
|
+
case 'panel':
|
|
64
|
+
return {
|
|
65
|
+
nodeType: nodes.panel,
|
|
66
|
+
attrs: {
|
|
67
|
+
panelType: 'info'
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
case 'codeblock':
|
|
71
|
+
return {
|
|
72
|
+
nodeType: nodes.codeBlock
|
|
73
|
+
};
|
|
74
|
+
case 'bulletList':
|
|
75
|
+
return {
|
|
76
|
+
nodeType: nodes.bulletList
|
|
77
|
+
};
|
|
78
|
+
case 'orderedList':
|
|
79
|
+
return {
|
|
80
|
+
nodeType: nodes.orderedList
|
|
81
|
+
};
|
|
82
|
+
case 'taskList':
|
|
83
|
+
return {
|
|
84
|
+
nodeType: nodes.taskList
|
|
85
|
+
};
|
|
86
|
+
default:
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
// Helper functions to categorize node types
|
|
92
|
+
var isBlockNode = exports.isBlockNode = function isBlockNode(node) {
|
|
93
|
+
return ['paragraph', 'heading', 'codeBlock'].includes(node.type.name);
|
|
94
|
+
};
|
|
95
|
+
var isListNode = exports.isListNode = function isListNode(node) {
|
|
96
|
+
return ['bulletList', 'orderedList', 'taskList', 'listItem'].includes(node.type.name);
|
|
97
|
+
};
|
|
98
|
+
var isContainerNode = exports.isContainerNode = function isContainerNode(node) {
|
|
99
|
+
return ['panel', 'expand', 'blockquote'].includes(node.type.name);
|
|
100
|
+
};
|
|
101
|
+
var isBlockNodeType = exports.isBlockNodeType = function isBlockNodeType(nodeType) {
|
|
102
|
+
return ['paragraph', 'heading', 'codeBlock'].includes(nodeType.name);
|
|
103
|
+
};
|
|
104
|
+
var isListNodeType = exports.isListNodeType = function isListNodeType(nodeType) {
|
|
105
|
+
return ['bulletList', 'orderedList', 'taskList'].includes(nodeType.name);
|
|
106
|
+
};
|
|
107
|
+
var isContainerNodeType = exports.isContainerNodeType = function isContainerNodeType(nodeType) {
|
|
108
|
+
return ['panel', 'expand', 'blockquote'].includes(nodeType.name);
|
|
109
|
+
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { createBlockMenuRegistry } from './editor-actions';
|
|
3
|
+
import { formatNode } from './editor-commands/formatNode';
|
|
3
4
|
import { createPlugin } from './pm-plugins/main';
|
|
4
5
|
import BlockMenu from './ui/block-menu';
|
|
5
6
|
import { getBlockMenuComponents } from './ui/block-menu-components';
|
|
@@ -28,6 +29,11 @@ export const blockMenuPlugin = ({
|
|
|
28
29
|
return registry.components;
|
|
29
30
|
}
|
|
30
31
|
},
|
|
32
|
+
commands: {
|
|
33
|
+
formatNode: (currentNode, targetType) => {
|
|
34
|
+
return formatNode(currentNode, targetType);
|
|
35
|
+
}
|
|
36
|
+
},
|
|
31
37
|
contentComponent({
|
|
32
38
|
editorView,
|
|
33
39
|
popupsMountPoint,
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { transformNodeToTargetType } from './transforms/transformNodeToTargetType';
|
|
2
|
+
/**
|
|
3
|
+
* Formats the current node or selection to the specified target type
|
|
4
|
+
* @param currentNode - The current node
|
|
5
|
+
* @param targetType - The target node type to convert to
|
|
6
|
+
*/
|
|
7
|
+
export const formatNode = (currentNode, targetType) => {
|
|
8
|
+
return ({
|
|
9
|
+
tr
|
|
10
|
+
}) => {
|
|
11
|
+
const {
|
|
12
|
+
selection
|
|
13
|
+
} = tr;
|
|
14
|
+
try {
|
|
15
|
+
return transformNodeToTargetType(tr, currentNode, selection.from, targetType);
|
|
16
|
+
} catch (e) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { transformToContainer } from './container-transforms';
|
|
2
|
+
import { transformToList } from './list-transforms';
|
|
3
|
+
import { isListNodeType, isContainerNodeType, isBlockNodeType } from './utils';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Transform block nodes (paragraph, heading, codeblock)
|
|
7
|
+
*/
|
|
8
|
+
export const transformBlockNode = context => {
|
|
9
|
+
const {
|
|
10
|
+
tr,
|
|
11
|
+
targetNodeType,
|
|
12
|
+
targetAttrs
|
|
13
|
+
} = context;
|
|
14
|
+
const {
|
|
15
|
+
selection
|
|
16
|
+
} = tr;
|
|
17
|
+
const {
|
|
18
|
+
$from,
|
|
19
|
+
$to
|
|
20
|
+
} = selection;
|
|
21
|
+
|
|
22
|
+
// Handle transformation to list types
|
|
23
|
+
if (isListNodeType(targetNodeType)) {
|
|
24
|
+
return transformToList();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Handle transformation to container types (panel, expand, blockquote)
|
|
28
|
+
if (isContainerNodeType(targetNodeType)) {
|
|
29
|
+
return transformToContainer();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Handle block type transformation (paragraph, heading, codeblock)
|
|
33
|
+
if (isBlockNodeType(targetNodeType)) {
|
|
34
|
+
tr.setBlockType($from.pos, $to.pos, targetNodeType, targetAttrs);
|
|
35
|
+
return tr;
|
|
36
|
+
}
|
|
37
|
+
return null;
|
|
38
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { isBlockNodeType, isListNodeType, isContainerNodeType } from './utils';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Transform selection to container type
|
|
5
|
+
*/
|
|
6
|
+
export const transformToContainer = () => {
|
|
7
|
+
return null;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Transform container nodes (panel, expand, blockquote)
|
|
12
|
+
*/
|
|
13
|
+
export const transformContainerNode = ({
|
|
14
|
+
tr,
|
|
15
|
+
sourcePos,
|
|
16
|
+
targetNodeType,
|
|
17
|
+
targetAttrs
|
|
18
|
+
}) => {
|
|
19
|
+
if (sourcePos === null) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Transform container to block type - unwrap and convert content
|
|
24
|
+
if (isBlockNodeType(targetNodeType)) {
|
|
25
|
+
return unwrapAndConvertToBlockType();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Transform container to list type
|
|
29
|
+
if (isListNodeType(targetNodeType)) {
|
|
30
|
+
return unwrapAndConvertToList();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Transform between container types
|
|
34
|
+
if (isContainerNodeType(targetNodeType)) {
|
|
35
|
+
tr.setNodeMarkup(sourcePos, targetNodeType, targetAttrs);
|
|
36
|
+
return tr;
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Unwrap container node and convert content to block type
|
|
43
|
+
*/
|
|
44
|
+
export const unwrapAndConvertToBlockType = () => {
|
|
45
|
+
// Convert to block type directly
|
|
46
|
+
return null;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Unwrap container node and convert content to list
|
|
51
|
+
*/
|
|
52
|
+
export const unwrapAndConvertToList = () => {
|
|
53
|
+
// Convert to list directly
|
|
54
|
+
return null;
|
|
55
|
+
};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { isBlockNodeType, isContainerNodeType, isListNodeType } from './utils';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Transform selection to list type
|
|
5
|
+
*/
|
|
6
|
+
export const transformToList = () => {
|
|
7
|
+
return null;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Transform list nodes
|
|
12
|
+
*/
|
|
13
|
+
export const transformListNode = ({
|
|
14
|
+
targetNodeType
|
|
15
|
+
}) => {
|
|
16
|
+
// Transform list to block type
|
|
17
|
+
if (isBlockNodeType(targetNodeType)) {
|
|
18
|
+
// Lift list items out of the list and convert to target block type
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Transform list to container type
|
|
23
|
+
if (isContainerNodeType(targetNodeType)) {
|
|
24
|
+
// Lift list items out of the list and convert to container type
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Transform between list types
|
|
29
|
+
if (isListNodeType(targetNodeType)) {
|
|
30
|
+
// Lift list items out of the list and convert to the other list type
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Lift list content and convert to block type
|
|
38
|
+
*/
|
|
39
|
+
export const liftListToBlockType = () => {
|
|
40
|
+
// Convert to target block type directly
|
|
41
|
+
return null;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Transform between different list types
|
|
46
|
+
*/
|
|
47
|
+
export const transformBetweenListTypes = () => {
|
|
48
|
+
return null;
|
|
49
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { transformBlockNode } from './block-transforms';
|
|
2
|
+
import { transformContainerNode } from './container-transforms';
|
|
3
|
+
import { transformListNode } from './list-transforms';
|
|
4
|
+
import { getTargetNodeInfo, isBlockNode, isListNode, isContainerNode } from './utils';
|
|
5
|
+
export function transformNodeToTargetType(tr, sourceNode, sourcePos, targetType) {
|
|
6
|
+
const {
|
|
7
|
+
nodes
|
|
8
|
+
} = tr.doc.type.schema;
|
|
9
|
+
const targetNodeInfo = getTargetNodeInfo(targetType, nodes);
|
|
10
|
+
if (!targetNodeInfo) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
const {
|
|
14
|
+
nodeType: targetNodeType,
|
|
15
|
+
attrs: targetAttrs
|
|
16
|
+
} = targetNodeInfo;
|
|
17
|
+
|
|
18
|
+
// Early return if trying to transform to the same type
|
|
19
|
+
if (sourceNode.type === targetNodeType) {
|
|
20
|
+
return tr; // No transformation needed
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Prepare transformation context
|
|
24
|
+
const transformationContext = {
|
|
25
|
+
tr,
|
|
26
|
+
sourceNode,
|
|
27
|
+
sourcePos,
|
|
28
|
+
targetNodeType,
|
|
29
|
+
targetAttrs
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
// Route to appropriate transformation strategy based on source node type
|
|
33
|
+
try {
|
|
34
|
+
if (isBlockNode(sourceNode)) {
|
|
35
|
+
return transformBlockNode(transformationContext);
|
|
36
|
+
}
|
|
37
|
+
if (isListNode(sourceNode)) {
|
|
38
|
+
return transformListNode(transformationContext);
|
|
39
|
+
}
|
|
40
|
+
if (isContainerNode(sourceNode)) {
|
|
41
|
+
return transformContainerNode(transformationContext);
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
} catch (e) {
|
|
45
|
+
// Node transformation failed
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|