/
deleteBlock.ts
69 lines (61 loc) · 2.29 KB
/
deleteBlock.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import type {
ContentModelBlock,
EntityRemovalOperation,
FormatContentModelContext,
} from 'roosterjs-content-model-types';
/**
* Delete a content model block from current selection
* @param blocks Array of the block to delete
* @param blockToDelete The block to delete
* @param replacement @optional If specified, use this block to replace the deleted block
* @param context @optional Context object provided by formatContentModel API
* @param direction @optional Whether this is deleting forward or backward. This is only used for deleting entity.
* If not specified, only selected entity will be deleted
*/
export function deleteBlock(
blocks: ContentModelBlock[],
blockToDelete: ContentModelBlock,
replacement?: ContentModelBlock,
context?: FormatContentModelContext,
direction?: 'forward' | 'backward'
): boolean {
const index = blocks.indexOf(blockToDelete);
switch (blockToDelete.blockType) {
case 'Table':
case 'Divider':
replacement ? blocks.splice(index, 1, replacement) : blocks.splice(index, 1);
return true;
case 'Entity':
const operation: EntityRemovalOperation | undefined = blockToDelete.isSelected
? 'overwrite'
: direction == 'forward'
? 'removeFromStart'
: direction == 'backward'
? 'removeFromEnd'
: undefined;
if (operation !== undefined) {
replacement ? blocks.splice(index, 1, replacement) : blocks.splice(index, 1);
context?.deletedEntities.push({
entity: blockToDelete,
operation,
});
}
return true;
case 'BlockGroup':
switch (blockToDelete.blockGroupType) {
case 'General':
if (replacement) {
blocks.splice(index, 1, replacement);
return true;
} else {
// no op, let browser handle it
return false;
}
case 'ListItem':
case 'FormatContainer':
blocks.splice(index, 1);
return true;
}
}
return false;
}