@atlaskit/editor-plugin-block-menu 6.0.9 → 6.0.10

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.
Files changed (21) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/cjs/editor-commands/transform-node-utils/TRANSFORMATION_MATRIX.js +224 -0
  3. package/dist/cjs/editor-commands/transform-node-utils/steps/convertEachNodeStep.js +58 -1
  4. package/dist/cjs/editor-commands/transform-node-utils/steps/wrapMixedContentStep.js +12 -1
  5. package/dist/cjs/editor-commands/transform-node-utils/transform.js +4 -238
  6. package/dist/cjs/editor-commands/transform-node-utils/utils.js +33 -11
  7. package/dist/es2019/editor-commands/transform-node-utils/TRANSFORMATION_MATRIX.js +219 -0
  8. package/dist/es2019/editor-commands/transform-node-utils/steps/convertEachNodeStep.js +56 -1
  9. package/dist/es2019/editor-commands/transform-node-utils/steps/wrapMixedContentStep.js +13 -2
  10. package/dist/es2019/editor-commands/transform-node-utils/transform.js +5 -240
  11. package/dist/es2019/editor-commands/transform-node-utils/utils.js +32 -10
  12. package/dist/esm/editor-commands/transform-node-utils/TRANSFORMATION_MATRIX.js +219 -0
  13. package/dist/esm/editor-commands/transform-node-utils/steps/convertEachNodeStep.js +58 -1
  14. package/dist/esm/editor-commands/transform-node-utils/steps/wrapMixedContentStep.js +13 -2
  15. package/dist/esm/editor-commands/transform-node-utils/transform.js +5 -240
  16. package/dist/esm/editor-commands/transform-node-utils/utils.js +32 -10
  17. package/dist/types/editor-commands/transform-node-utils/TRANSFORMATION_MATRIX.d.ts +2 -0
  18. package/dist/types/editor-commands/transform-node-utils/utils.d.ts +10 -5
  19. package/dist/types-ts4.5/editor-commands/transform-node-utils/TRANSFORMATION_MATRIX.d.ts +2 -0
  20. package/dist/types-ts4.5/editor-commands/transform-node-utils/utils.d.ts +10 -5
  21. package/package.json +4 -4
@@ -0,0 +1,219 @@
1
+ import { flattenStep } from './flattenStep';
2
+ import { applyTargetTextTypeStep } from './steps/applyTargetTextTypeStep';
3
+ import { convertEachNodeStep } from './steps/convertEachNodeStep';
4
+ import { decisionListToListStep } from './steps/decisionListToListStep';
5
+ import { flattenListStep } from './steps/flattenListStep';
6
+ import { listToDecisionListStep } from './steps/listToDecisionListStep';
7
+ import { listToListStep } from './steps/listToListStep';
8
+ import { mergeNeighbourListsStep } from './steps/mergeNeighbourListsStep';
9
+ import { unwrapLayoutStep } from './steps/unwrapLayoutStep';
10
+ import { unwrapListStep } from './steps/unwrapListStep';
11
+ import { wrapBlockquoteToDecisionListStep } from './steps/wrapBlockquoteToDecisionListStep';
12
+ import { wrapMixedContentStep } from './steps/wrapMixedContentStep';
13
+ import { unwrapExpandStep } from './unwrapExpandStep';
14
+ import { unwrapStep } from './unwrapStep';
15
+ import { wrapIntoListStep } from './wrapIntoListStep';
16
+ import { wrapStep } from './wrapStep';
17
+
18
+ // Transform steps for all node type pairs.
19
+ // If a transformation is not defined (undefined), it is not available.
20
+ export var TRANSFORMATION_MATRIX = {
21
+ paragraph: {
22
+ heading: [flattenStep, applyTargetTextTypeStep],
23
+ blockquote: [wrapMixedContentStep],
24
+ codeBlock: [wrapMixedContentStep],
25
+ expand: [wrapMixedContentStep],
26
+ nestedExpand: [wrapMixedContentStep],
27
+ layoutSection: [wrapMixedContentStep],
28
+ panel: [wrapMixedContentStep],
29
+ bulletList: [wrapIntoListStep],
30
+ orderedList: [wrapIntoListStep],
31
+ taskList: [wrapIntoListStep],
32
+ decisionList: [wrapIntoListStep]
33
+ },
34
+ heading: {
35
+ heading: [flattenStep, applyTargetTextTypeStep],
36
+ paragraph: [flattenStep, applyTargetTextTypeStep],
37
+ blockquote: [wrapMixedContentStep],
38
+ codeBlock: [wrapMixedContentStep],
39
+ expand: [wrapMixedContentStep],
40
+ nestedExpand: [wrapMixedContentStep],
41
+ layoutSection: [wrapMixedContentStep],
42
+ panel: [wrapMixedContentStep],
43
+ bulletList: [wrapIntoListStep],
44
+ orderedList: [wrapIntoListStep],
45
+ taskList: [wrapIntoListStep],
46
+ decisionList: [wrapIntoListStep]
47
+ },
48
+ panel: {
49
+ blockquote: [unwrapStep, wrapMixedContentStep],
50
+ codeBlock: [unwrapStep, wrapMixedContentStep],
51
+ expand: [unwrapStep, wrapStep],
52
+ nestedExpand: [unwrapStep, wrapStep],
53
+ layoutSection: [unwrapStep, wrapMixedContentStep],
54
+ paragraph: [unwrapStep]
55
+ },
56
+ expand: {
57
+ panel: [unwrapExpandStep, wrapMixedContentStep],
58
+ blockquote: [unwrapExpandStep, wrapMixedContentStep],
59
+ layoutSection: [unwrapExpandStep, wrapMixedContentStep],
60
+ nestedExpand: [unwrapExpandStep, wrapStep],
61
+ paragraph: [unwrapExpandStep]
62
+ },
63
+ nestedExpand: {
64
+ panel: [unwrapExpandStep, wrapMixedContentStep],
65
+ blockquote: [unwrapExpandStep, wrapMixedContentStep],
66
+ layoutSection: [unwrapExpandStep, wrapMixedContentStep],
67
+ paragraph: [unwrapExpandStep]
68
+ },
69
+ blockquote: {
70
+ expand: [wrapStep],
71
+ nestedExpand: [wrapStep],
72
+ layoutSection: [wrapMixedContentStep],
73
+ panel: [unwrapStep, wrapStep],
74
+ paragraph: [unwrapStep],
75
+ heading: [unwrapStep, applyTargetTextTypeStep],
76
+ decisionList: [unwrapStep, wrapBlockquoteToDecisionListStep]
77
+ },
78
+ layoutSection: {
79
+ blockquote: [unwrapLayoutStep, wrapMixedContentStep],
80
+ expand: [unwrapLayoutStep, wrapStep],
81
+ nestedExpand: [unwrapLayoutStep, wrapStep],
82
+ panel: [unwrapLayoutStep, wrapMixedContentStep],
83
+ paragraph: [unwrapLayoutStep]
84
+ },
85
+ codeBlock: {
86
+ blockquote: [wrapStep],
87
+ expand: [wrapStep],
88
+ nestedExpand: [wrapStep],
89
+ layoutSection: [wrapMixedContentStep],
90
+ panel: [wrapStep],
91
+ paragraph: [applyTargetTextTypeStep]
92
+ },
93
+ bulletList: {
94
+ orderedList: [listToListStep],
95
+ taskList: [listToListStep],
96
+ decisionList: [flattenListStep, listToDecisionListStep],
97
+ blockquote: [wrapStep],
98
+ expand: [wrapStep],
99
+ nestedExpand: [wrapStep],
100
+ layoutSection: [wrapMixedContentStep],
101
+ panel: [wrapStep],
102
+ paragraph: [flattenListStep, unwrapListStep, applyTargetTextTypeStep]
103
+ },
104
+ orderedList: {
105
+ bulletList: [listToListStep],
106
+ taskList: [listToListStep],
107
+ decisionList: [flattenListStep, listToDecisionListStep],
108
+ blockquote: [wrapStep],
109
+ expand: [wrapStep],
110
+ nestedExpand: [wrapStep],
111
+ layoutSection: [wrapMixedContentStep],
112
+ panel: [wrapStep],
113
+ paragraph: [flattenListStep, unwrapListStep, applyTargetTextTypeStep]
114
+ },
115
+ taskList: {
116
+ bulletList: [listToListStep],
117
+ orderedList: [listToListStep],
118
+ decisionList: [flattenListStep, listToDecisionListStep],
119
+ expand: [wrapStep],
120
+ nestedExpand: [wrapStep],
121
+ layoutSection: [wrapMixedContentStep],
122
+ panel: [wrapStep],
123
+ paragraph: [flattenListStep, unwrapListStep, applyTargetTextTypeStep]
124
+ },
125
+ table: {
126
+ expand: [wrapStep],
127
+ nestedExpand: [wrapStep],
128
+ layoutSection: [wrapMixedContentStep]
129
+ },
130
+ mediaSingle: {
131
+ blockquote: [wrapStep],
132
+ expand: [wrapStep],
133
+ nestedExpand: [wrapStep],
134
+ layoutSection: [wrapMixedContentStep],
135
+ panel: [wrapStep],
136
+ bulletList: [wrapIntoListStep],
137
+ orderedList: [wrapIntoListStep]
138
+ },
139
+ mediaGroup: {
140
+ blockquote: [wrapStep],
141
+ expand: [wrapStep],
142
+ nestedExpand: [wrapStep],
143
+ layoutSection: [wrapMixedContentStep],
144
+ panel: [wrapStep]
145
+ },
146
+ media: {
147
+ blockquote: [wrapStep],
148
+ codeBlock: [wrapStep],
149
+ expand: [wrapStep],
150
+ nestedExpand: [wrapStep],
151
+ layoutSection: [wrapStep],
152
+ panel: [wrapStep],
153
+ bulletList: [wrapIntoListStep],
154
+ orderedList: [wrapIntoListStep],
155
+ taskList: [wrapIntoListStep],
156
+ decisionList: [wrapIntoListStep]
157
+ },
158
+ decisionList: {
159
+ bulletList: [decisionListToListStep],
160
+ orderedList: [decisionListToListStep],
161
+ taskList: [decisionListToListStep],
162
+ blockquote: [unwrapListStep, wrapStep],
163
+ codeBlock: [unwrapListStep, wrapMixedContentStep],
164
+ expand: [wrapStep],
165
+ nestedExpand: [wrapStep],
166
+ layoutSection: [wrapMixedContentStep],
167
+ panel: [wrapStep],
168
+ paragraph: [flattenListStep, unwrapListStep, applyTargetTextTypeStep],
169
+ heading: [flattenListStep, unwrapListStep, applyTargetTextTypeStep]
170
+ },
171
+ blockCard: {
172
+ expand: [wrapStep],
173
+ nestedExpand: [wrapStep],
174
+ layoutSection: [wrapMixedContentStep],
175
+ panel: [wrapStep]
176
+ },
177
+ embedCard: {
178
+ expand: [wrapStep],
179
+ nestedExpand: [wrapStep],
180
+ layoutSection: [wrapMixedContentStep]
181
+ },
182
+ extension: {
183
+ blockquote: [wrapStep],
184
+ expand: [wrapStep],
185
+ nestedExpand: [wrapStep],
186
+ layoutSection: [wrapMixedContentStep],
187
+ panel: [wrapStep]
188
+ },
189
+ bodiedExtension: {
190
+ nestedExpand: [wrapStep],
191
+ layoutSection: [wrapMixedContentStep]
192
+ },
193
+ multiBodiedExtension: {
194
+ blockquote: [wrapStep],
195
+ codeBlock: [wrapStep],
196
+ expand: [wrapStep],
197
+ nestedExpand: [wrapStep],
198
+ layoutSection: [wrapStep],
199
+ panel: [wrapStep],
200
+ bulletList: [wrapIntoListStep],
201
+ orderedList: [wrapIntoListStep],
202
+ taskList: [wrapIntoListStep],
203
+ decisionList: [wrapIntoListStep]
204
+ },
205
+ multi: {
206
+ blockquote: [wrapMixedContentStep],
207
+ codeBlock: [wrapMixedContentStep],
208
+ expand: [wrapMixedContentStep],
209
+ nestedExpand: [wrapMixedContentStep],
210
+ layoutSection: [wrapMixedContentStep],
211
+ panel: [wrapMixedContentStep],
212
+ bulletList: [convertEachNodeStep, mergeNeighbourListsStep],
213
+ orderedList: [convertEachNodeStep, mergeNeighbourListsStep],
214
+ taskList: [convertEachNodeStep, mergeNeighbourListsStep],
215
+ decisionList: [convertEachNodeStep, mergeNeighbourListsStep],
216
+ paragraph: [convertEachNodeStep],
217
+ heading: [applyTargetTextTypeStep]
218
+ }
219
+ };
@@ -3,6 +3,46 @@ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol
3
3
  function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
4
4
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
5
5
  import { convertNodesToTargetType } from '../transform';
6
+ /**
7
+ * Handles the edge case where transforming multi-selection to decisionList results in
8
+ * all content breaking out (no valid children for the target). In this case, creates an empty
9
+ * decisionList to ensure the target type exists.
10
+ *
11
+ * Similar to handleEmptyContainerEdgeCase in wrapMixedContentStep, but specifically for
12
+ * multi-to-decisionList transformations where blockquotes break out.
13
+ *
14
+ * @param result - The current result nodes after processing
15
+ * @param hasCreatedDecisionList - Whether a decisionList was already created during processing
16
+ * @param targetNodeTypeName - The target node type name
17
+ * @param schema - The schema
18
+ * @returns The result nodes with an empty decisionList prepended if needed, or the original result
19
+ */
20
+ var handleEmptyDecisionListEdgeCase = function handleEmptyDecisionListEdgeCase(result, hasCreatedDecisionList, targetNodeTypeName, schema) {
21
+ // Only apply this edge case for decisionList target
22
+ if (targetNodeTypeName !== 'decisionList') {
23
+ return result;
24
+ }
25
+
26
+ // If no decisionList was created but we have nodes in result, all content broke out
27
+ var allContentBrokeOut = !hasCreatedDecisionList && result.length > 0;
28
+ if (!allContentBrokeOut) {
29
+ return result;
30
+ }
31
+
32
+ // Create an empty decisionList
33
+ var decisionListType = schema.nodes.decisionList;
34
+ var decisionItemType = schema.nodes.decisionItem;
35
+ if (decisionListType && decisionItemType) {
36
+ var emptyDecisionItem = decisionItemType.createAndFill();
37
+ if (emptyDecisionItem) {
38
+ var emptyDecisionList = decisionListType.createAndFill({}, [emptyDecisionItem]);
39
+ if (emptyDecisionList) {
40
+ return [emptyDecisionList].concat(_toConsumableArray(result));
41
+ }
42
+ }
43
+ }
44
+ return result;
45
+ };
6
46
  export var convertEachNodeStep = function convertEachNodeStep(nodes, context) {
7
47
  var schema = context.schema,
8
48
  targetNodeTypeName = context.targetNodeTypeName,
@@ -11,12 +51,19 @@ export var convertEachNodeStep = function convertEachNodeStep(nodes, context) {
11
51
  if (!targetNodeType) {
12
52
  return nodes;
13
53
  }
54
+ var blockquoteType = schema.nodes.blockquote;
14
55
  var resultNodes = [];
56
+ var hasCreatedDecisionList = false;
15
57
  var _iterator = _createForOfIteratorHelper(nodes),
16
58
  _step;
17
59
  try {
18
60
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
19
61
  var node = _step.value;
62
+ // Edge case: blockquotes should break out when transforming to decisionList
63
+ if (targetNodeTypeName === 'decisionList' && blockquoteType && node.type === blockquoteType) {
64
+ resultNodes.push(node);
65
+ continue;
66
+ }
20
67
  var transformedNodes = convertNodesToTargetType({
21
68
  sourceNodes: [node],
22
69
  targetNodeType: targetNodeType,
@@ -26,14 +73,24 @@ export var convertEachNodeStep = function convertEachNodeStep(nodes, context) {
26
73
  });
27
74
  if (transformedNodes.length > 0) {
28
75
  resultNodes.push.apply(resultNodes, _toConsumableArray(transformedNodes));
76
+ // Track if we created a decisionList
77
+
78
+ if (targetNodeTypeName === 'decisionList' && transformedNodes.some(function (n) {
79
+ return n.type === targetNodeType;
80
+ })) {
81
+ hasCreatedDecisionList = true;
82
+ }
29
83
  } else {
30
84
  resultNodes.push(node);
31
85
  }
32
86
  }
87
+
88
+ // Handle edge case: if no decisionList was created, create an empty one
33
89
  } catch (err) {
34
90
  _iterator.e(err);
35
91
  } finally {
36
92
  _iterator.f();
37
93
  }
38
- return resultNodes;
94
+ var finalResult = handleEmptyDecisionListEdgeCase(resultNodes, hasCreatedDecisionList, targetNodeTypeName, schema);
95
+ return finalResult;
39
96
  };
@@ -2,7 +2,7 @@ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
2
  import { Fragment } from '@atlaskit/editor-prosemirror/model';
3
3
  import { removeDisallowedMarks } from '../marks';
4
4
  import { NODE_CATEGORY_BY_TYPE } from '../types';
5
- import { convertTextNodeToParagraph, createTextContent, isTextNode } from '../utils';
5
+ import { convertTextNodeToParagraph, isTextNode, splitTextNodeForCodeBlock } from '../utils';
6
6
 
7
7
  /**
8
8
  * Creates a layout section with two columns, where the first column contains the provided content.
@@ -149,7 +149,18 @@ export var wrapMixedContentStep = function wrapMixedContentStep(nodes, context)
149
149
  (_currentContainerCont = currentContainerContent).push.apply(_currentContainerCont, _toConsumableArray(removeDisallowedMarks([node], validationType)));
150
150
  };
151
151
  var handleCodeblockTextNode = function handleCodeblockTextNode(node) {
152
- currentContainerContent.push(createTextContent(node));
152
+ // Split the text node into text parts and incompatible inline nodes
153
+ var parts = splitTextNodeForCodeBlock(node, schema);
154
+ parts.forEach(function (part) {
155
+ if (typeof part === 'string') {
156
+ // Text content - add to current codeBlock
157
+ currentContainerContent.push(part);
158
+ } else {
159
+ // Incompatible inline node wrapped in paragraph - break it out
160
+ flushCurrentContainer();
161
+ result.push(part);
162
+ }
163
+ });
153
164
  };
154
165
  var handleConvertibleTextNode = function handleConvertibleTextNode(node) {
155
166
  var paragraph = convertTextNodeToParagraph(node, schema);
@@ -1,238 +1,6 @@
1
1
  import { getTargetNodeTypeNameInContext } from '../transform-node-utils/utils';
2
- import { flattenStep } from './flattenStep';
3
- import { applyTargetTextTypeStep } from './steps/applyTargetTextTypeStep';
4
- import { convertEachNodeStep } from './steps/convertEachNodeStep';
5
- import { decisionListToListStep } from './steps/decisionListToListStep';
6
- import { flattenListStep } from './steps/flattenListStep';
7
- import { listToDecisionListStep } from './steps/listToDecisionListStep';
8
- import { listToListStep } from './steps/listToListStep';
9
- import { mergeNeighbourListsStep } from './steps/mergeNeighbourListsStep';
10
- import { unwrapLayoutStep } from './steps/unwrapLayoutStep';
11
- import { unwrapListStep } from './steps/unwrapListStep';
12
- import { wrapBlockquoteToDecisionListStep } from './steps/wrapBlockquoteToDecisionListStep';
13
- import { wrapMixedContentStep } from './steps/wrapMixedContentStep';
14
- import { getNodeName, NODE_CATEGORY_BY_TYPE, toNodeTypeValue } from './types';
15
- import { unwrapExpandStep } from './unwrapExpandStep';
16
- import { unwrapStep } from './unwrapStep';
17
- import { wrapIntoListStep } from './wrapIntoListStep';
18
- import { wrapStep } from './wrapStep';
19
-
20
- // Transform steps for combinations of node categories (block/container/list/text)
21
- var TRANSFORM_STEPS = {
22
- atomic: {
23
- atomic: undefined,
24
- container: [wrapStep],
25
- list: [wrapIntoListStep],
26
- text: undefined,
27
- multi: undefined
28
- },
29
- container: {
30
- atomic: undefined,
31
- container: [unwrapStep, wrapStep],
32
- list: undefined,
33
- text: [unwrapStep],
34
- multi: undefined
35
- },
36
- list: {
37
- atomic: undefined,
38
- container: [wrapStep],
39
- list: [listToListStep],
40
- text: [flattenListStep, unwrapListStep, applyTargetTextTypeStep],
41
- multi: undefined
42
- },
43
- text: {
44
- atomic: undefined,
45
- container: [wrapMixedContentStep],
46
- list: [wrapIntoListStep],
47
- text: [flattenStep, applyTargetTextTypeStep],
48
- multi: undefined
49
- },
50
- multi: {
51
- atomic: undefined,
52
- container: [wrapMixedContentStep],
53
- list: [convertEachNodeStep, mergeNeighbourListsStep],
54
- text: [convertEachNodeStep],
55
- multi: undefined
56
- }
57
- };
58
-
59
- // Transform steps for specific pairs of node types that cannot be processed
60
- // using generic rules/steps from TRANSFORM_STEPS.
61
- // Use 'null' to indicate unavailable transfrorm for a case where TRANSFORM_STEPS are not undefined.
62
- var TRANSFORM_STEPS_OVERRIDE = {
63
- paragraph: {
64
- paragraph: null
65
- },
66
- heading: {},
67
- panel: {
68
- panel: null,
69
- layoutSection: [unwrapStep, wrapMixedContentStep],
70
- codeBlock: [unwrapStep, wrapMixedContentStep],
71
- blockquote: [unwrapStep, wrapMixedContentStep],
72
- taskList: null,
73
- bulletList: null,
74
- orderedList: null,
75
- heading: null
76
- },
77
- expand: {
78
- expand: null,
79
- panel: [unwrapExpandStep, wrapMixedContentStep],
80
- blockquote: [unwrapExpandStep, wrapMixedContentStep],
81
- layoutSection: [unwrapExpandStep, wrapMixedContentStep],
82
- paragraph: [unwrapExpandStep],
83
- codeBlock: null,
84
- heading: null
85
- },
86
- nestedExpand: {
87
- expand: null,
88
- nestedExpand: null,
89
- panel: [unwrapExpandStep, wrapMixedContentStep],
90
- blockquote: [unwrapExpandStep, wrapMixedContentStep],
91
- paragraph: [unwrapExpandStep],
92
- codeBlock: null,
93
- heading: null
94
- },
95
- blockquote: {
96
- blockquote: null,
97
- expand: [wrapStep],
98
- nestedExpand: [wrapStep],
99
- layoutSection: [wrapMixedContentStep],
100
- codeBlock: null,
101
- decisionList: [unwrapStep, wrapBlockquoteToDecisionListStep],
102
- paragraph: [unwrapStep],
103
- heading: [unwrapStep, applyTargetTextTypeStep]
104
- },
105
- layoutSection: {
106
- layoutSection: null,
107
- blockquote: [unwrapLayoutStep, wrapMixedContentStep],
108
- expand: [unwrapLayoutStep, wrapStep],
109
- panel: [unwrapLayoutStep, wrapMixedContentStep],
110
- codeBlock: null,
111
- paragraph: [unwrapLayoutStep],
112
- heading: null
113
- },
114
- codeBlock: {
115
- codeBlock: null,
116
- blockquote: [wrapStep],
117
- expand: [wrapStep],
118
- nestedExpand: [wrapStep],
119
- layoutSection: [wrapMixedContentStep],
120
- panel: [wrapStep],
121
- paragraph: [applyTargetTextTypeStep],
122
- heading: null
123
- },
124
- bulletList: {
125
- bulletList: null,
126
- codeBlock: null,
127
- layoutSection: [wrapMixedContentStep],
128
- decisionList: [flattenListStep, listToDecisionListStep],
129
- heading: null
130
- },
131
- orderedList: {
132
- orderedList: null,
133
- codeBlock: null,
134
- layoutSection: [wrapMixedContentStep],
135
- decisionList: [flattenListStep, listToDecisionListStep],
136
- heading: null
137
- },
138
- taskList: {
139
- blockquote: null,
140
- codeBlock: null,
141
- layoutSection: [wrapMixedContentStep],
142
- decisionList: [flattenListStep, listToDecisionListStep],
143
- heading: null,
144
- taskList: null
145
- },
146
- table: {
147
- layoutSection: [wrapMixedContentStep],
148
- blockquote: null,
149
- panel: null,
150
- codeBlock: null,
151
- orderedList: null,
152
- bulletList: null,
153
- taskList: null,
154
- decisionList: null
155
- },
156
- mediaSingle: {
157
- layoutSection: [wrapMixedContentStep],
158
- codeBlock: null,
159
- decisionList: null,
160
- taskList: null
161
- },
162
- mediaGroup: {
163
- layoutSection: [wrapMixedContentStep],
164
- codeBlock: null,
165
- decisionList: null,
166
- bulletList: null,
167
- orderedList: null,
168
- taskList: null
169
- },
170
- decisionList: {
171
- decisionList: null,
172
- bulletList: [decisionListToListStep],
173
- orderedList: [decisionListToListStep],
174
- taskList: [decisionListToListStep],
175
- layoutSection: [wrapMixedContentStep],
176
- blockquote: [unwrapListStep, wrapStep],
177
- codeBlock: [unwrapListStep, wrapMixedContentStep]
178
- },
179
- blockCard: {
180
- layoutSection: [wrapMixedContentStep],
181
- blockquote: null,
182
- codeBlock: null,
183
- orderedList: null,
184
- bulletList: null,
185
- taskList: null,
186
- decisionList: null
187
- },
188
- embedCard: {
189
- layoutSection: [wrapMixedContentStep],
190
- blockquote: null,
191
- panel: null,
192
- codeBlock: null,
193
- orderedList: null,
194
- bulletList: null,
195
- taskList: null,
196
- decisionList: null
197
- },
198
- extension: {
199
- layoutSection: [wrapMixedContentStep],
200
- codeBlock: null,
201
- decisionList: null,
202
- taskList: null,
203
- orderedList: null,
204
- bulletList: null
205
- },
206
- bodiedExtension: {
207
- layoutSection: [wrapMixedContentStep],
208
- blockquote: null,
209
- expand: null,
210
- panel: null,
211
- codeBlock: null,
212
- orderedList: null,
213
- bulletList: null,
214
- taskList: null,
215
- decisionList: null
216
- },
217
- multi: {
218
- heading: [applyTargetTextTypeStep]
219
- // Similar to heading, all structures are kept as is
220
- // EG: transformed: other lists, paragarph, headings
221
- // eg: not-transformed: quotes, codeblocks ... all typeof 'containers'
222
- // decisionList: [],
223
- }
224
- };
225
- var getTransformStepsForNodeTypes = function getTransformStepsForNodeTypes(selectedNodeTypeName, targetNodeTypeName) {
226
- var _TRANSFORM_STEPS_OVER;
227
- var fromCategory = NODE_CATEGORY_BY_TYPE[selectedNodeTypeName];
228
- var toCategory = NODE_CATEGORY_BY_TYPE[targetNodeTypeName];
229
- var overrideSteps = (_TRANSFORM_STEPS_OVER = TRANSFORM_STEPS_OVERRIDE[selectedNodeTypeName]) === null || _TRANSFORM_STEPS_OVER === void 0 ? void 0 : _TRANSFORM_STEPS_OVER[targetNodeTypeName];
230
- if (overrideSteps === null) {
231
- return null;
232
- }
233
- var steps = overrideSteps !== null && overrideSteps !== void 0 ? overrideSteps : TRANSFORM_STEPS[fromCategory][toCategory];
234
- return steps;
235
- };
2
+ import { TRANSFORMATION_MATRIX } from './TRANSFORMATION_MATRIX';
3
+ import { getNodeName, toNodeTypeValue } from './types';
236
4
  /**
237
5
  * Convert a list of nodes to a target node type.
238
6
  * If no steps are found, the source nodes are returned unchanged.
@@ -265,7 +33,7 @@ export var convertNodesToTargetType = function convertNodesToTargetType(_ref) {
265
33
  if (!selectedNodeTypeName || !targetNodeTypeName) {
266
34
  return sourceNodes;
267
35
  }
268
- var steps = getTransformStepsForNodeTypes(selectedNodeTypeName, targetNodeTypeName);
36
+ var steps = TRANSFORMATION_MATRIX[selectedNodeTypeName][targetNodeTypeName];
269
37
  var context = {
270
38
  // sourceNode is incorrect now - what to do here?
271
39
  fromNode: sourceNode,
@@ -281,9 +49,6 @@ export var convertNodesToTargetType = function convertNodesToTargetType(_ref) {
281
49
  }, sourceNodes);
282
50
  };
283
51
  export var isTransformDisabledBasedOnStepsConfig = function isTransformDisabledBasedOnStepsConfig(selectedNodeType, targetNodeType) {
284
- var steps = getTransformStepsForNodeTypes(selectedNodeType, targetNodeType);
285
- if (!steps || steps.length === 0) {
286
- return true;
287
- }
288
- return false;
52
+ var steps = TRANSFORMATION_MATRIX[selectedNodeType][targetNodeType];
53
+ return !steps || steps.length === 0;
289
54
  };
@@ -126,20 +126,42 @@ export var getBlockNodesInRange = function getBlockNodesInRange(range) {
126
126
  };
127
127
 
128
128
  /**
129
- * Iterates over a nodes children and extracting text content, removing all other inline content and converting
130
- * hardbreaks to newlines.
129
+ * Splits a text node (paragraph/heading) into parts for codeBlock conversion.
130
+ * Returns an array of:
131
+ * - strings (text content that can go into codeBlock)
132
+ * - PMNodes (incompatible inline nodes wrapped in paragraphs that need to break out)
131
133
  *
132
- * @param node - The node to create text content from (should be paragraph)
133
- * @returns The text content string.
134
+ * This preserves inline nodes (like status, inlineExtension) that cannot be represented as plain text.
135
+ *
136
+ * @param node - The text node (paragraph or heading) to split
137
+ * @param schema - The schema to use for creating paragraph nodes
138
+ * @returns Array of strings (for codeBlock) and PMNodes (to break out)
134
139
  */
135
- export var createTextContent = function createTextContent(node) {
136
- var textContent = node.children.map(function (child) {
140
+ export var splitTextNodeForCodeBlock = function splitTextNodeForCodeBlock(node, schema) {
141
+ var result = [];
142
+ var currentText = '';
143
+ node.content.forEach(function (child) {
137
144
  if (child.isText) {
138
- return child.text;
145
+ currentText += child.text || '';
139
146
  } else if (child.type.name === 'hardBreak') {
140
- return '\n';
147
+ currentText += '\n';
148
+ } else {
149
+ // Incompatible inline node (status, inlineExtension, etc.)
150
+ // Flush accumulated text if any
151
+ if (currentText) {
152
+ result.push(currentText);
153
+ currentText = '';
154
+ }
155
+ // Wrap the inline node in a paragraph and add it to break out
156
+ var paragraph = schema.nodes.paragraph.create({}, child);
157
+ result.push(paragraph);
141
158
  }
142
- return '';
143
159
  });
144
- return textContent.join('');
160
+
161
+ // Don't forget remaining text (or empty string for empty nodes)
162
+ // Always push at least an empty string so empty paragraphs create empty codeBlocks
163
+ if (currentText || result.length === 0) {
164
+ result.push(currentText);
165
+ }
166
+ return result;
145
167
  };
@@ -0,0 +1,2 @@
1
+ import type { NodeTypeName, TransformStep } from './types';
2
+ export declare const TRANSFORMATION_MATRIX: Record<NodeTypeName, Partial<Record<NodeTypeName, TransformStep[]>>>;
@@ -29,10 +29,15 @@ export declare const convertExpandToNestedExpand: (node: PMNode, schema: Schema)
29
29
  export declare const convertTextNodeToParagraph: (node: PMNode, schema: Schema) => PMNode | null;
30
30
  export declare const getBlockNodesInRange: (range: NodeRange) => PMNode[];
31
31
  /**
32
- * Iterates over a nodes children and extracting text content, removing all other inline content and converting
33
- * hardbreaks to newlines.
32
+ * Splits a text node (paragraph/heading) into parts for codeBlock conversion.
33
+ * Returns an array of:
34
+ * - strings (text content that can go into codeBlock)
35
+ * - PMNodes (incompatible inline nodes wrapped in paragraphs that need to break out)
34
36
  *
35
- * @param node - The node to create text content from (should be paragraph)
36
- * @returns The text content string.
37
+ * This preserves inline nodes (like status, inlineExtension) that cannot be represented as plain text.
38
+ *
39
+ * @param node - The text node (paragraph or heading) to split
40
+ * @param schema - The schema to use for creating paragraph nodes
41
+ * @returns Array of strings (for codeBlock) and PMNodes (to break out)
37
42
  */
38
- export declare const createTextContent: (node: PMNode) => string;
43
+ export declare const splitTextNodeForCodeBlock: (node: PMNode, schema: Schema) => Array<string | PMNode>;
@@ -0,0 +1,2 @@
1
+ import type { NodeTypeName, TransformStep } from './types';
2
+ export declare const TRANSFORMATION_MATRIX: Record<NodeTypeName, Partial<Record<NodeTypeName, TransformStep[]>>>;