@atlaskit/editor-plugin-block-menu 1.0.2 → 1.0.4
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 +18 -0
- package/dist/cjs/editor-commands/formatNode.js +2 -2
- package/dist/cjs/editor-commands/transforms/container-transforms.js +60 -4
- package/dist/cjs/editor-commands/transforms/list/transformBetweenListTypes.js +69 -71
- package/dist/cjs/editor-commands/transforms/list/transformToTaskList.js +44 -0
- package/dist/cjs/editor-commands/transforms/list-transforms.js +40 -30
- package/dist/cjs/editor-commands/transforms/utils.js +16 -2
- package/dist/cjs/ui/block-menu-components.js +2 -1
- package/dist/es2019/editor-commands/formatNode.js +2 -2
- package/dist/es2019/editor-commands/transforms/container-transforms.js +64 -4
- package/dist/es2019/editor-commands/transforms/list/transformBetweenListTypes.js +73 -70
- package/dist/es2019/editor-commands/transforms/list/transformToTaskList.js +38 -0
- package/dist/es2019/editor-commands/transforms/list-transforms.js +38 -28
- package/dist/es2019/editor-commands/transforms/utils.js +15 -1
- package/dist/es2019/ui/block-menu-components.js +2 -1
- package/dist/esm/editor-commands/formatNode.js +2 -2
- package/dist/esm/editor-commands/transforms/container-transforms.js +60 -4
- package/dist/esm/editor-commands/transforms/list/transformBetweenListTypes.js +70 -71
- package/dist/esm/editor-commands/transforms/list/transformToTaskList.js +37 -0
- package/dist/esm/editor-commands/transforms/list-transforms.js +37 -27
- package/dist/esm/editor-commands/transforms/utils.js +15 -1
- package/dist/esm/ui/block-menu-components.js +2 -1
- package/dist/types/editor-commands/transforms/container-transforms.d.ts +1 -1
- package/dist/types/editor-commands/transforms/list/transformBetweenListTypes.d.ts +3 -7
- package/dist/types/editor-commands/transforms/list/transformToTaskList.d.ts +10 -0
- package/dist/types/editor-commands/transforms/list-transforms.d.ts +1 -1
- package/dist/types/editor-commands/transforms/transformNodeToTargetType.d.ts +1 -1
- package/dist/types/editor-commands/transforms/types.d.ts +1 -1
- package/dist/types/editor-commands/transforms/utils.d.ts +4 -0
- package/dist/types-ts4.5/editor-commands/transforms/container-transforms.d.ts +1 -1
- package/dist/types-ts4.5/editor-commands/transforms/list/transformBetweenListTypes.d.ts +3 -7
- package/dist/types-ts4.5/editor-commands/transforms/list/transformToTaskList.d.ts +10 -0
- package/dist/types-ts4.5/editor-commands/transforms/list-transforms.d.ts +1 -1
- package/dist/types-ts4.5/editor-commands/transforms/transformNodeToTargetType.d.ts +1 -1
- package/dist/types-ts4.5/editor-commands/transforms/types.d.ts +1 -1
- package/dist/types-ts4.5/editor-commands/transforms/utils.d.ts +4 -0
- package/package.json +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# @atlaskit/editor-plugin-block-menu
|
|
2
2
|
|
|
3
|
+
## 1.0.4
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`30454d0f4baf2`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/30454d0f4baf2) -
|
|
8
|
+
Support multiple levels list to list transform
|
|
9
|
+
- [`cb4decb701766`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/cb4decb701766) -
|
|
10
|
+
[ux] Enable max height on block menu flyout menu
|
|
11
|
+
- Updated dependencies
|
|
12
|
+
|
|
13
|
+
## 1.0.3
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- [`3db18eece6c2f`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/3db18eece6c2f) -
|
|
18
|
+
[ux] Adds basic conversion from expand, panel, blockquote to bulled, numbered or task list.
|
|
19
|
+
- Updated dependencies
|
|
20
|
+
|
|
3
21
|
## 1.0.2
|
|
4
22
|
|
|
5
23
|
### Patch Changes
|
|
@@ -18,7 +18,7 @@ var formatNode = exports.formatNode = function formatNode(targetType) {
|
|
|
18
18
|
|
|
19
19
|
// Find the node to format from the current selection
|
|
20
20
|
var nodeToFormat;
|
|
21
|
-
var nodePos =
|
|
21
|
+
var nodePos = selection.from;
|
|
22
22
|
|
|
23
23
|
// Try to find the current node from selection
|
|
24
24
|
var selectedNode = (0, _utils.findSelectedNodeOfType)([nodes.paragraph, nodes.heading, nodes.blockquote, nodes.panel, nodes.expand, nodes.codeBlock, nodes.bulletList, nodes.orderedList, nodes.taskList, nodes.layoutSection])(selection);
|
|
@@ -40,7 +40,7 @@ var formatNode = exports.formatNode = function formatNode(targetType) {
|
|
|
40
40
|
nodeToFormat = listParent.node;
|
|
41
41
|
nodePos = listParent.pos;
|
|
42
42
|
}
|
|
43
|
-
} else if (paragraphOrHeadingNode) {
|
|
43
|
+
} else if (parentNode.node.type !== nodes.blockquote && paragraphOrHeadingNode) {
|
|
44
44
|
nodeToFormat = paragraphOrHeadingNode.node;
|
|
45
45
|
nodePos = paragraphOrHeadingNode.pos;
|
|
46
46
|
}
|
|
@@ -50,6 +50,7 @@ var transformToContainer = exports.transformToContainer = function transformToCo
|
|
|
50
50
|
*/
|
|
51
51
|
var transformContainerNode = exports.transformContainerNode = function transformContainerNode(_ref2) {
|
|
52
52
|
var tr = _ref2.tr,
|
|
53
|
+
sourceNode = _ref2.sourceNode,
|
|
53
54
|
sourcePos = _ref2.sourcePos,
|
|
54
55
|
targetNodeType = _ref2.targetNodeType,
|
|
55
56
|
targetAttrs = _ref2.targetAttrs;
|
|
@@ -64,7 +65,13 @@ var transformContainerNode = exports.transformContainerNode = function transform
|
|
|
64
65
|
|
|
65
66
|
// Transform container to list type
|
|
66
67
|
if ((0, _utils.isListNodeType)(targetNodeType)) {
|
|
67
|
-
return unwrapAndConvertToList(
|
|
68
|
+
return unwrapAndConvertToList({
|
|
69
|
+
tr: tr,
|
|
70
|
+
sourceNode: sourceNode,
|
|
71
|
+
sourcePos: sourcePos,
|
|
72
|
+
targetNodeType: targetNodeType,
|
|
73
|
+
targetAttrs: targetAttrs
|
|
74
|
+
});
|
|
68
75
|
}
|
|
69
76
|
|
|
70
77
|
// Transform between container types
|
|
@@ -86,7 +93,56 @@ var unwrapAndConvertToBlockType = exports.unwrapAndConvertToBlockType = function
|
|
|
86
93
|
/**
|
|
87
94
|
* Unwrap container node and convert content to list
|
|
88
95
|
*/
|
|
89
|
-
var unwrapAndConvertToList = exports.unwrapAndConvertToList = function unwrapAndConvertToList() {
|
|
90
|
-
|
|
91
|
-
|
|
96
|
+
var unwrapAndConvertToList = exports.unwrapAndConvertToList = function unwrapAndConvertToList(_ref3) {
|
|
97
|
+
var tr = _ref3.tr,
|
|
98
|
+
sourceNode = _ref3.sourceNode,
|
|
99
|
+
sourcePos = _ref3.sourcePos,
|
|
100
|
+
targetNodeType = _ref3.targetNodeType,
|
|
101
|
+
targetAttrs = _ref3.targetAttrs;
|
|
102
|
+
if (sourcePos === null) {
|
|
103
|
+
return tr;
|
|
104
|
+
}
|
|
105
|
+
var schema = tr.doc.type.schema;
|
|
106
|
+
var _schema$nodes = schema.nodes,
|
|
107
|
+
listItem = _schema$nodes.listItem,
|
|
108
|
+
paragraph = _schema$nodes.paragraph,
|
|
109
|
+
taskList = _schema$nodes.taskList,
|
|
110
|
+
taskItem = _schema$nodes.taskItem;
|
|
111
|
+
var isTargetTaskList = targetNodeType === taskList;
|
|
112
|
+
var createListItemFromInline = function createListItemFromInline(inlineFrag) {
|
|
113
|
+
return isTargetTaskList ? taskItem.create(null, inlineFrag) : listItem.create(null, paragraph.create(null, inlineFrag));
|
|
114
|
+
};
|
|
115
|
+
var getInlineContent = function getInlineContent(textblock) {
|
|
116
|
+
var inlineContent = [];
|
|
117
|
+
textblock.forEach(function (inline) {
|
|
118
|
+
inlineContent.push(inline);
|
|
119
|
+
});
|
|
120
|
+
return inlineContent;
|
|
121
|
+
};
|
|
122
|
+
var items = [];
|
|
123
|
+
|
|
124
|
+
// Expand's title should become the first item of the list
|
|
125
|
+
if (sourceNode.type.name === 'expand') {
|
|
126
|
+
var _sourceNode$attrs;
|
|
127
|
+
var title = (_sourceNode$attrs = sourceNode.attrs) === null || _sourceNode$attrs === void 0 ? void 0 : _sourceNode$attrs.title;
|
|
128
|
+
if (title) {
|
|
129
|
+
var titleContent = schema.text(title);
|
|
130
|
+
items.push(isTargetTaskList ? taskItem.create(null, titleContent) : listItem.create(null, paragraph.create(null, titleContent)));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
for (var i = 0; i < sourceNode.childCount; i++) {
|
|
134
|
+
var node = sourceNode.child(i);
|
|
135
|
+
|
|
136
|
+
// Abort early if unsupported content (e.g. table) encounted inside of the container
|
|
137
|
+
if (!node.isTextblock) {
|
|
138
|
+
return tr;
|
|
139
|
+
}
|
|
140
|
+
var inline = _model.Fragment.from(getInlineContent(node));
|
|
141
|
+
items.push(createListItemFromInline(inline));
|
|
142
|
+
}
|
|
143
|
+
if (!items.length) {
|
|
144
|
+
return tr;
|
|
145
|
+
}
|
|
146
|
+
var list = targetNodeType.create(targetAttrs || null, _model.Fragment.from(items));
|
|
147
|
+
return tr.replaceWith(sourcePos, sourcePos + sourceNode.nodeSize, list);
|
|
92
148
|
};
|
|
@@ -6,95 +6,93 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.transformListStructure = void 0;
|
|
8
8
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
9
|
+
var _utils = require("../utils");
|
|
9
10
|
/**
|
|
10
|
-
*
|
|
11
|
+
* Convert a block node to inline content suitable for task items
|
|
11
12
|
*/
|
|
12
|
-
var
|
|
13
|
-
var
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
var convertBlockToInlineContent = function convertBlockToInlineContent(node, schema) {
|
|
14
|
+
var paragraph = schema.nodes.paragraph;
|
|
15
|
+
if (node.type === paragraph) {
|
|
16
|
+
return (0, _toConsumableArray2.default)(node.content.content);
|
|
16
17
|
}
|
|
17
|
-
|
|
18
|
+
if (node.isBlock) {
|
|
19
|
+
var textContent = node.textContent;
|
|
20
|
+
return textContent ? [schema.text(textContent)] : [];
|
|
21
|
+
}
|
|
22
|
+
return [node];
|
|
18
23
|
};
|
|
19
24
|
|
|
20
25
|
/**
|
|
21
|
-
* Transform list structure
|
|
26
|
+
* Transform list structure between different list types
|
|
22
27
|
*/
|
|
23
|
-
var transformListStructure = exports.transformListStructure = function transformListStructure(
|
|
28
|
+
var transformListStructure = exports.transformListStructure = function transformListStructure(context) {
|
|
29
|
+
var tr = context.tr,
|
|
30
|
+
sourceNode = context.sourceNode,
|
|
31
|
+
sourcePos = context.sourcePos,
|
|
32
|
+
targetNodeType = context.targetNodeType;
|
|
33
|
+
var nodes = tr.doc.type.schema.nodes;
|
|
24
34
|
try {
|
|
35
|
+
var listNode = {
|
|
36
|
+
node: sourceNode,
|
|
37
|
+
pos: sourcePos
|
|
38
|
+
};
|
|
25
39
|
var sourceList = listNode.node,
|
|
26
40
|
listPos = listNode.pos;
|
|
27
|
-
var
|
|
28
|
-
orderedList = nodes.orderedList,
|
|
29
|
-
taskList = nodes.taskList,
|
|
41
|
+
var taskList = nodes.taskList,
|
|
30
42
|
listItem = nodes.listItem,
|
|
31
43
|
taskItem = nodes.taskItem,
|
|
32
44
|
paragraph = nodes.paragraph;
|
|
33
|
-
var isSourceBulletOrOrdered =
|
|
34
|
-
var isTargetTask = targetNodeType
|
|
35
|
-
var isSourceTask = sourceList.type
|
|
36
|
-
var
|
|
37
|
-
var
|
|
38
|
-
var
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
// Extract all inline content from all child nodes
|
|
53
|
-
for (var i = 0; i < node.childCount; i++) {
|
|
54
|
-
var child = node.child(i);
|
|
55
|
-
if (child.type === paragraph) {
|
|
56
|
-
// Extract inline content from paragraphs
|
|
57
|
-
inlineContent.push.apply(inlineContent, (0, _toConsumableArray2.default)(extractInlineContent(child)));
|
|
58
|
-
} else if (child.isBlock) {
|
|
59
|
-
// For other block content types eg. codeBlock, extract their text content and create text nodes
|
|
60
|
-
var textContent = child.textContent;
|
|
61
|
-
if (textContent) {
|
|
62
|
-
var textNode = tr.doc.type.schema.text(textContent);
|
|
63
|
-
inlineContent.push(textNode);
|
|
45
|
+
var isSourceBulletOrOrdered = (0, _utils.isBulletOrOrderedList)(sourceList.type);
|
|
46
|
+
var isTargetTask = (0, _utils.isTaskList)(targetNodeType);
|
|
47
|
+
var isSourceTask = (0, _utils.isTaskList)(sourceList.type);
|
|
48
|
+
var isTargetBulletOrOrdered = (0, _utils.isBulletOrOrderedList)(targetNodeType);
|
|
49
|
+
var supportedListTypes = (0, _utils.getSupportedListTypesSet)(nodes);
|
|
50
|
+
var _transformListRecursively = function transformListRecursively(listNode) {
|
|
51
|
+
var transformedItems = [];
|
|
52
|
+
listNode.forEach(function (child) {
|
|
53
|
+
if (isSourceBulletOrOrdered && isTargetTask) {
|
|
54
|
+
// Convert bullet/ordered => task
|
|
55
|
+
if (child.type === listItem) {
|
|
56
|
+
var inlineContent = [];
|
|
57
|
+
var nestedTaskLists = [];
|
|
58
|
+
child.forEach(function (grandChild) {
|
|
59
|
+
if (supportedListTypes.has(grandChild.type) && grandChild.type !== taskList) {
|
|
60
|
+
nestedTaskLists.push(_transformListRecursively(grandChild));
|
|
61
|
+
} else {
|
|
62
|
+
inlineContent.push.apply(inlineContent, (0, _toConsumableArray2.default)(convertBlockToInlineContent(grandChild, tr.doc.type.schema)));
|
|
64
63
|
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
|
|
64
|
+
});
|
|
65
|
+
if (inlineContent.length > 0) {
|
|
66
|
+
transformedItems.push(taskItem.create(null, inlineContent));
|
|
68
67
|
}
|
|
68
|
+
transformedItems.push.apply(transformedItems, nestedTaskLists);
|
|
69
69
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
70
|
+
} else if (isSourceTask && isTargetBulletOrOrdered) {
|
|
71
|
+
// Convert task => bullet/ordered
|
|
72
|
+
if (child.type === taskItem) {
|
|
73
|
+
var _inlineContent = (0, _toConsumableArray2.default)(child.content.content);
|
|
74
|
+
if (_inlineContent.length > 0) {
|
|
75
|
+
var paragraphNode = paragraph.create(null, _inlineContent);
|
|
76
|
+
transformedItems.push(listItem.create(null, [paragraphNode]));
|
|
77
|
+
}
|
|
78
|
+
} else if (child.type === taskList) {
|
|
79
|
+
var transformedNestedList = _transformListRecursively(child);
|
|
80
|
+
var lastItem = transformedItems[transformedItems.length - 1];
|
|
81
|
+
if ((lastItem === null || lastItem === void 0 ? void 0 : lastItem.type) === listItem) {
|
|
82
|
+
// Attach nested list to previous item
|
|
83
|
+
var updatedContent = [].concat((0, _toConsumableArray2.default)(lastItem.content.content), [transformedNestedList]);
|
|
84
|
+
transformedItems[transformedItems.length - 1] = listItem.create(lastItem.attrs, updatedContent);
|
|
85
|
+
} else {
|
|
86
|
+
// No previous item, flatten nested items
|
|
87
|
+
transformedItems.push.apply(transformedItems, (0, _toConsumableArray2.default)(transformedNestedList.content.content));
|
|
88
|
+
}
|
|
84
89
|
}
|
|
85
90
|
}
|
|
86
|
-
}
|
|
87
|
-
return
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// Create new list with transformed items
|
|
94
|
-
var newList = targetNodeType.create(null, newListItems);
|
|
95
|
-
|
|
96
|
-
// Replace the entire list
|
|
97
|
-
tr.replaceWith(listStart, listEnd, newList);
|
|
91
|
+
});
|
|
92
|
+
return targetNodeType.create(null, transformedItems);
|
|
93
|
+
};
|
|
94
|
+
var newList = _transformListRecursively(sourceList);
|
|
95
|
+
tr.replaceWith(listPos, listPos + sourceList.nodeSize, newList);
|
|
98
96
|
return tr;
|
|
99
97
|
} catch (_unused) {
|
|
100
98
|
return tr;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.transformToTaskList = void 0;
|
|
8
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
9
|
+
/**
|
|
10
|
+
* Transform selection to task list
|
|
11
|
+
* Handles the special structure where taskItem contains text directly (no paragraph wrapper)
|
|
12
|
+
*/
|
|
13
|
+
var transformToTaskList = exports.transformToTaskList = function transformToTaskList(tr, range, targetNodeType, targetAttrs, nodes) {
|
|
14
|
+
try {
|
|
15
|
+
var taskItem = nodes.taskItem;
|
|
16
|
+
var listItems = [];
|
|
17
|
+
|
|
18
|
+
// Process each block in the range
|
|
19
|
+
tr.doc.nodesBetween(range.start, range.end, function (node) {
|
|
20
|
+
if (node.isBlock) {
|
|
21
|
+
// For block nodes like paragraphs, directly use their inline content
|
|
22
|
+
var inlineContent = (0, _toConsumableArray2.default)(node.content.content);
|
|
23
|
+
if (inlineContent.length > 0) {
|
|
24
|
+
// Create task item with inline content directly
|
|
25
|
+
var listItem = taskItem.create(targetAttrs, inlineContent);
|
|
26
|
+
listItems.push(listItem);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return false; // Don't traverse into children
|
|
30
|
+
});
|
|
31
|
+
if (listItems.length === 0) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Create the new task list
|
|
36
|
+
var newList = targetNodeType.create(targetAttrs, listItems);
|
|
37
|
+
|
|
38
|
+
// Replace the range with the new list
|
|
39
|
+
tr.replaceWith(range.start, range.end, newList);
|
|
40
|
+
return tr;
|
|
41
|
+
} catch (_unused) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
@@ -5,16 +5,17 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.transformListToBlockNodes = exports.transformListNode = exports.transformBlockToList = exports.transformBetweenListTypes = exports.liftListToBlockType = void 0;
|
|
7
7
|
var _transform = require("@atlaskit/editor-prosemirror/transform");
|
|
8
|
-
var _utils = require("@atlaskit/editor-prosemirror/utils");
|
|
9
8
|
var _transformBetweenListTypes = require("./list/transformBetweenListTypes");
|
|
10
9
|
var _transformOrderedUnorderedListToBlockNodes = require("./list/transformOrderedUnorderedListToBlockNodes");
|
|
11
10
|
var _transformTaskListToBlockNodes = require("./list/transformTaskListToBlockNodes");
|
|
12
|
-
var
|
|
11
|
+
var _transformToTaskList = require("./list/transformToTaskList");
|
|
12
|
+
var _utils = require("./utils");
|
|
13
13
|
/**
|
|
14
14
|
* Transform selection to list type
|
|
15
15
|
*/
|
|
16
16
|
var transformBlockToList = exports.transformBlockToList = function transformBlockToList(context) {
|
|
17
17
|
var tr = context.tr,
|
|
18
|
+
sourceNode = context.sourceNode,
|
|
18
19
|
targetNodeType = context.targetNodeType,
|
|
19
20
|
targetAttrs = context.targetAttrs;
|
|
20
21
|
var _tr$selection = tr.selection,
|
|
@@ -25,16 +26,14 @@ var transformBlockToList = exports.transformBlockToList = function transformBloc
|
|
|
25
26
|
return null;
|
|
26
27
|
}
|
|
27
28
|
var nodes = tr.doc.type.schema.nodes;
|
|
28
|
-
var isTargetTask =
|
|
29
|
+
var isTargetTask = (0, _utils.isTaskList)(targetNodeType);
|
|
29
30
|
|
|
30
31
|
// Handle task lists differently due to their structure
|
|
31
|
-
// TODO: ED-29152 - Implement task list transformation
|
|
32
32
|
if (isTargetTask) {
|
|
33
|
-
return
|
|
33
|
+
return (0, _transformToTaskList.transformToTaskList)(tr, range, targetNodeType, targetAttrs, nodes);
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
// For headings, convert to paragraph first since headings cannot be direct children of list items
|
|
37
|
-
var sourceNode = tr.doc.nodeAt(range.start);
|
|
38
37
|
if (sourceNode && sourceNode.type.name.startsWith('heading')) {
|
|
39
38
|
tr.setBlockType(range.start, range.end, nodes.paragraph);
|
|
40
39
|
}
|
|
@@ -69,19 +68,19 @@ var transformListToBlockNodes = exports.transformListToBlockNodes = function tra
|
|
|
69
68
|
var transformListNode = exports.transformListNode = function transformListNode(context) {
|
|
70
69
|
var targetNodeType = context.targetNodeType;
|
|
71
70
|
// Transform list to block type
|
|
72
|
-
if ((0,
|
|
71
|
+
if ((0, _utils.isBlockNodeType)(targetNodeType)) {
|
|
73
72
|
// Lift list items out of the list and convert to target block type
|
|
74
73
|
return transformListToBlockNodes(context);
|
|
75
74
|
}
|
|
76
75
|
|
|
77
76
|
// Transform list to container type
|
|
78
|
-
if ((0,
|
|
77
|
+
if ((0, _utils.isContainerNodeType)(targetNodeType)) {
|
|
79
78
|
// Lift list items out of the list and convert to container type
|
|
80
79
|
return null;
|
|
81
80
|
}
|
|
82
81
|
|
|
83
82
|
// Transform between list types
|
|
84
|
-
if ((0,
|
|
83
|
+
if ((0, _utils.isListNodeType)(targetNodeType)) {
|
|
85
84
|
return transformBetweenListTypes(context);
|
|
86
85
|
}
|
|
87
86
|
return null;
|
|
@@ -98,37 +97,48 @@ var liftListToBlockType = exports.liftListToBlockType = function liftListToBlock
|
|
|
98
97
|
/**
|
|
99
98
|
* Transform between different list types
|
|
100
99
|
*/
|
|
101
|
-
var transformBetweenListTypes = exports.transformBetweenListTypes = function transformBetweenListTypes(
|
|
102
|
-
var tr =
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
100
|
+
var transformBetweenListTypes = exports.transformBetweenListTypes = function transformBetweenListTypes(context) {
|
|
101
|
+
var tr = context.tr,
|
|
102
|
+
sourceNode = context.sourceNode,
|
|
103
|
+
sourcePos = context.sourcePos,
|
|
104
|
+
targetNodeType = context.targetNodeType;
|
|
106
105
|
var nodes = tr.doc.type.schema.nodes;
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
var
|
|
110
|
-
|
|
111
|
-
var
|
|
112
|
-
if (!listNode) {
|
|
113
|
-
return null;
|
|
114
|
-
}
|
|
115
|
-
var sourceListType = listNode.node.type;
|
|
116
|
-
var isSourceBulletOrOrdered = sourceListType === nodes.bulletList || sourceListType === nodes.orderedList;
|
|
117
|
-
var isTargetTask = targetNodeType === nodes.taskList;
|
|
118
|
-
var isSourceTask = sourceListType === nodes.taskList;
|
|
119
|
-
var isTargetBulletOrOrdered = targetNodeType === nodes.bulletList || targetNodeType === nodes.orderedList;
|
|
106
|
+
var sourceListType = sourceNode.type;
|
|
107
|
+
var isSourceBulletOrOrdered = (0, _utils.isBulletOrOrderedList)(sourceListType);
|
|
108
|
+
var isTargetTask = (0, _utils.isTaskList)(targetNodeType);
|
|
109
|
+
var isSourceTask = (0, _utils.isTaskList)(sourceListType);
|
|
110
|
+
var isTargetBulletOrOrdered = (0, _utils.isBulletOrOrderedList)(targetNodeType);
|
|
120
111
|
|
|
121
112
|
// Check if we need structure transformation
|
|
122
113
|
var needsStructureTransform = isSourceBulletOrOrdered && isTargetTask || isSourceTask && isTargetBulletOrOrdered;
|
|
123
114
|
try {
|
|
124
115
|
if (!needsStructureTransform) {
|
|
125
116
|
// Simple type change for same structure lists (bullet <-> ordered)
|
|
126
|
-
|
|
117
|
+
// Apply to the main list
|
|
118
|
+
tr.setNodeMarkup(sourcePos, targetNodeType);
|
|
119
|
+
|
|
120
|
+
// Apply to nested lists
|
|
121
|
+
var listStart = sourcePos;
|
|
122
|
+
var listEnd = sourcePos + sourceNode.nodeSize;
|
|
123
|
+
var supportedListTypesSet = (0, _utils.getSupportedListTypesSet)(nodes);
|
|
124
|
+
tr.doc.nodesBetween(listStart, listEnd, function (node, pos, parent) {
|
|
125
|
+
// Only process nested lists (not the root list we already handled)
|
|
126
|
+
if (supportedListTypesSet.has(node.type) && pos !== sourcePos) {
|
|
127
|
+
var isNestedList = parent && (supportedListTypesSet.has(parent.type) || parent.type === nodes.listItem);
|
|
128
|
+
if (isNestedList) {
|
|
129
|
+
var shouldTransformNode = node.type === sourceListType || (0, _utils.isBulletOrOrderedList)(node.type) && isTargetBulletOrOrdered;
|
|
130
|
+
if (shouldTransformNode) {
|
|
131
|
+
tr.setNodeMarkup(pos, targetNodeType);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return true; // Continue traversing
|
|
136
|
+
});
|
|
137
|
+
return tr;
|
|
127
138
|
} else {
|
|
128
|
-
|
|
139
|
+
return (0, _transformBetweenListTypes.transformListStructure)(context);
|
|
129
140
|
}
|
|
130
141
|
} catch (_unused) {
|
|
131
142
|
return null;
|
|
132
143
|
}
|
|
133
|
-
return tr;
|
|
134
144
|
};
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.isListNodeType = exports.isListNode = exports.isContainerNodeType = exports.isContainerNode = exports.isBlockNodeType = exports.isBlockNode = exports.getTargetNodeInfo = void 0;
|
|
6
|
+
exports.isTaskList = exports.isListNodeType = exports.isListNode = exports.isContainerNodeType = exports.isContainerNode = exports.isBulletOrOrderedList = exports.isBlockNodeType = exports.isBlockNode = exports.getTargetNodeInfo = exports.getSupportedListTypesSet = exports.getSupportedListTypes = void 0;
|
|
7
7
|
var getTargetNodeInfo = exports.getTargetNodeInfo = function getTargetNodeInfo(targetType, nodes) {
|
|
8
8
|
switch (targetType) {
|
|
9
9
|
case 'heading1':
|
|
@@ -93,7 +93,7 @@ var isBlockNode = exports.isBlockNode = function isBlockNode(node) {
|
|
|
93
93
|
return ['paragraph', 'heading', 'codeBlock'].includes(node.type.name);
|
|
94
94
|
};
|
|
95
95
|
var isListNode = exports.isListNode = function isListNode(node) {
|
|
96
|
-
return ['bulletList', 'orderedList', 'taskList'
|
|
96
|
+
return ['bulletList', 'orderedList', 'taskList'].includes(node.type.name);
|
|
97
97
|
};
|
|
98
98
|
var isContainerNode = exports.isContainerNode = function isContainerNode(node) {
|
|
99
99
|
return ['panel', 'expand', 'blockquote'].includes(node.type.name);
|
|
@@ -106,4 +106,18 @@ var isListNodeType = exports.isListNodeType = function isListNodeType(nodeType)
|
|
|
106
106
|
};
|
|
107
107
|
var isContainerNodeType = exports.isContainerNodeType = function isContainerNodeType(nodeType) {
|
|
108
108
|
return ['panel', 'expand', 'blockquote'].includes(nodeType.name);
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
// List type utilities
|
|
112
|
+
var isBulletOrOrderedList = exports.isBulletOrOrderedList = function isBulletOrOrderedList(nodeType) {
|
|
113
|
+
return nodeType.name === 'bulletList' || nodeType.name === 'orderedList';
|
|
114
|
+
};
|
|
115
|
+
var isTaskList = exports.isTaskList = function isTaskList(nodeType) {
|
|
116
|
+
return nodeType.name === 'taskList';
|
|
117
|
+
};
|
|
118
|
+
var getSupportedListTypes = exports.getSupportedListTypes = function getSupportedListTypes(nodes) {
|
|
119
|
+
return [nodes.bulletList, nodes.orderedList, nodes.taskList].filter(Boolean);
|
|
120
|
+
};
|
|
121
|
+
var getSupportedListTypesSet = exports.getSupportedListTypesSet = function getSupportedListTypesSet(nodes) {
|
|
122
|
+
return new Set(getSupportedListTypes(nodes));
|
|
109
123
|
};
|
|
@@ -17,7 +17,7 @@ export const formatNode = targetType => {
|
|
|
17
17
|
|
|
18
18
|
// Find the node to format from the current selection
|
|
19
19
|
let nodeToFormat;
|
|
20
|
-
let nodePos =
|
|
20
|
+
let nodePos = selection.from;
|
|
21
21
|
|
|
22
22
|
// Try to find the current node from selection
|
|
23
23
|
const selectedNode = findSelectedNodeOfType([nodes.paragraph, nodes.heading, nodes.blockquote, nodes.panel, nodes.expand, nodes.codeBlock, nodes.bulletList, nodes.orderedList, nodes.taskList, nodes.layoutSection])(selection);
|
|
@@ -39,7 +39,7 @@ export const formatNode = targetType => {
|
|
|
39
39
|
nodeToFormat = listParent.node;
|
|
40
40
|
nodePos = listParent.pos;
|
|
41
41
|
}
|
|
42
|
-
} else if (paragraphOrHeadingNode) {
|
|
42
|
+
} else if (parentNode.node.type !== nodes.blockquote && paragraphOrHeadingNode) {
|
|
43
43
|
nodeToFormat = paragraphOrHeadingNode.node;
|
|
44
44
|
nodePos = paragraphOrHeadingNode.pos;
|
|
45
45
|
}
|
|
@@ -45,6 +45,7 @@ export const transformToContainer = ({
|
|
|
45
45
|
*/
|
|
46
46
|
export const transformContainerNode = ({
|
|
47
47
|
tr,
|
|
48
|
+
sourceNode,
|
|
48
49
|
sourcePos,
|
|
49
50
|
targetNodeType,
|
|
50
51
|
targetAttrs
|
|
@@ -60,7 +61,13 @@ export const transformContainerNode = ({
|
|
|
60
61
|
|
|
61
62
|
// Transform container to list type
|
|
62
63
|
if (isListNodeType(targetNodeType)) {
|
|
63
|
-
return unwrapAndConvertToList(
|
|
64
|
+
return unwrapAndConvertToList({
|
|
65
|
+
tr,
|
|
66
|
+
sourceNode,
|
|
67
|
+
sourcePos,
|
|
68
|
+
targetNodeType,
|
|
69
|
+
targetAttrs
|
|
70
|
+
});
|
|
64
71
|
}
|
|
65
72
|
|
|
66
73
|
// Transform between container types
|
|
@@ -82,7 +89,60 @@ export const unwrapAndConvertToBlockType = () => {
|
|
|
82
89
|
/**
|
|
83
90
|
* Unwrap container node and convert content to list
|
|
84
91
|
*/
|
|
85
|
-
export const unwrapAndConvertToList = (
|
|
86
|
-
|
|
87
|
-
|
|
92
|
+
export const unwrapAndConvertToList = ({
|
|
93
|
+
tr,
|
|
94
|
+
sourceNode,
|
|
95
|
+
sourcePos,
|
|
96
|
+
targetNodeType,
|
|
97
|
+
targetAttrs
|
|
98
|
+
}) => {
|
|
99
|
+
if (sourcePos === null) {
|
|
100
|
+
return tr;
|
|
101
|
+
}
|
|
102
|
+
const {
|
|
103
|
+
schema
|
|
104
|
+
} = tr.doc.type;
|
|
105
|
+
const {
|
|
106
|
+
listItem,
|
|
107
|
+
paragraph,
|
|
108
|
+
taskList,
|
|
109
|
+
taskItem
|
|
110
|
+
} = schema.nodes;
|
|
111
|
+
const isTargetTaskList = targetNodeType === taskList;
|
|
112
|
+
const createListItemFromInline = inlineFrag => {
|
|
113
|
+
return isTargetTaskList ? taskItem.create(null, inlineFrag) : listItem.create(null, paragraph.create(null, inlineFrag));
|
|
114
|
+
};
|
|
115
|
+
const getInlineContent = textblock => {
|
|
116
|
+
const inlineContent = [];
|
|
117
|
+
textblock.forEach(inline => {
|
|
118
|
+
inlineContent.push(inline);
|
|
119
|
+
});
|
|
120
|
+
return inlineContent;
|
|
121
|
+
};
|
|
122
|
+
const items = [];
|
|
123
|
+
|
|
124
|
+
// Expand's title should become the first item of the list
|
|
125
|
+
if (sourceNode.type.name === 'expand') {
|
|
126
|
+
var _sourceNode$attrs;
|
|
127
|
+
const title = (_sourceNode$attrs = sourceNode.attrs) === null || _sourceNode$attrs === void 0 ? void 0 : _sourceNode$attrs.title;
|
|
128
|
+
if (title) {
|
|
129
|
+
const titleContent = schema.text(title);
|
|
130
|
+
items.push(isTargetTaskList ? taskItem.create(null, titleContent) : listItem.create(null, paragraph.create(null, titleContent)));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
for (let i = 0; i < sourceNode.childCount; i++) {
|
|
134
|
+
const node = sourceNode.child(i);
|
|
135
|
+
|
|
136
|
+
// Abort early if unsupported content (e.g. table) encounted inside of the container
|
|
137
|
+
if (!node.isTextblock) {
|
|
138
|
+
return tr;
|
|
139
|
+
}
|
|
140
|
+
const inline = Fragment.from(getInlineContent(node));
|
|
141
|
+
items.push(createListItemFromInline(inline));
|
|
142
|
+
}
|
|
143
|
+
if (!items.length) {
|
|
144
|
+
return tr;
|
|
145
|
+
}
|
|
146
|
+
const list = targetNodeType.create(targetAttrs || null, Fragment.from(items));
|
|
147
|
+
return tr.replaceWith(sourcePos, sourcePos + sourceNode.nodeSize, list);
|
|
88
148
|
};
|