Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import type { DeleteSelectionStep } from 'roosterjs-content-model-types';

/**
* @internal
*/
export const deleteParagraphStyle: DeleteSelectionStep = context => {
if (context.deleteResult === 'nothingToDelete') {
const { insertPoint } = context;
const { paragraph } = insertPoint;

// If the paragraph is empty, we will delete any style in it
// This is to ensure the paragraph style is reset to default when there is no content in the paragraph
if (
paragraph.segments.every(
s => s.segmentType === 'SelectionMarker' || s.segmentType === 'Br'
) &&
paragraph.segments.filter(s => s.segmentType === 'Br').length <= 1 &&
Object.keys(paragraph.format).length > 0
) {
paragraph.format = {};
context.deleteResult = 'range';
}
}
};
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { deleteAllSegmentBefore } from './deleteSteps/deleteAllSegmentBefore';
import { deleteEmptyQuote } from './deleteSteps/deleteEmptyQuote';
import { deleteList } from './deleteSteps/deleteList';
import { deleteParagraphStyle } from './deleteSteps/deleteParagraphStyle';
import {
ChangeSource,
deleteSelection,
Expand Down Expand Up @@ -84,6 +85,7 @@ function getDeleteSteps(rawEvent: KeyboardEvent, isMac: boolean): (DeleteSelecti
isForward ? null : deleteList,
deleteCollapsedSelection,
deleteQuote,
deleteParagraphStyle,
];
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
import { deleteParagraphStyle } from '../../../lib/edit/deleteSteps/deleteParagraphStyle';
import { ValidDeleteSelectionContext } from 'roosterjs-content-model-types';

describe('deleteParagraphStyle', () => {
it('should delete paragraph style when paragraph is empty', () => {
const context: ValidDeleteSelectionContext = {
deleteResult: 'nothingToDelete',
insertPoint: {
paragraph: {
segments: [
{ segmentType: 'Br' } as any,
{ segmentType: 'SelectionMarker' } as any,
],
format: {
textAlign: 'center',
},
blockType: 'Paragraph',
},
marker: null!,
path: [],
},
};

deleteParagraphStyle(context);

expect(context.deleteResult).toBe('range');
expect(context.insertPoint.paragraph.format).toEqual({});
});

it('should not delete paragraph style when paragraph is not empty', () => {
const context: ValidDeleteSelectionContext = {
deleteResult: 'nothingToDelete',
insertPoint: {
paragraph: {
segments: [{ segmentType: 'Text', text: 'Hello World' } as any],
format: {
textAlign: 'center',
},
blockType: 'Paragraph',
},
marker: null!,
path: [],
},
};

deleteParagraphStyle(context);

expect(context.deleteResult).toBe('nothingToDelete');
expect(context.insertPoint.paragraph.format).toEqual({
textAlign: 'center',
});
});

it('should not delete paragraph style when paragraph has multiple line breaks', () => {
const context: ValidDeleteSelectionContext = {
deleteResult: 'nothingToDelete',
insertPoint: {
paragraph: {
segments: [
{ segmentType: 'Br' } as any,
{ segmentType: 'Br' } as any,
{ segmentType: 'SelectionMarker' } as any,
],
format: {
textAlign: 'center',
},
blockType: 'Paragraph',
},
marker: null!,
path: [],
},
};

deleteParagraphStyle(context);

expect(context.deleteResult).toBe('nothingToDelete');
expect(context.insertPoint.paragraph.format).toEqual({
textAlign: 'center',
});
});

it('should not delete paragraph style when paragraph has no format', () => {
const context: ValidDeleteSelectionContext = {
deleteResult: 'nothingToDelete',
insertPoint: {
paragraph: {
segments: [{ segmentType: 'Text', text: 'Hello World' } as any],
format: {},
blockType: 'Paragraph',
},
marker: null!,
path: [],
},
};

deleteParagraphStyle(context);

expect(context.deleteResult).toBe('nothingToDelete');
expect(context.insertPoint.paragraph.format).toEqual({});
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { ContentModelDocument, DOMSelection, IEditor } from 'roosterjs-content-m
import { deleteAllSegmentBefore } from '../../lib/edit/deleteSteps/deleteAllSegmentBefore';
import { deleteEmptyQuote } from '../../lib/edit/deleteSteps/deleteEmptyQuote';
import { deleteList } from '../../lib/edit/deleteSteps/deleteList';
import { deleteParagraphStyle } from '../../lib/edit/deleteSteps/deleteParagraphStyle';
import { DeleteResult, DeleteSelectionStep } from 'roosterjs-content-model-types';
import { editingTestCommon } from './editingTestCommon';
import { keyboardDelete } from '../../lib/edit/keyboardDelete';
Expand Down Expand Up @@ -90,7 +91,7 @@ describe('keyboardDelete', () => {
blockGroupType: 'Document',
blocks: [],
},
[null!, null!, null!, forwardDeleteCollapsedSelection, null!],
[null!, null!, null!, forwardDeleteCollapsedSelection, null!, deleteParagraphStyle],
'notDeleted',
true,
0
Expand All @@ -108,7 +109,14 @@ describe('keyboardDelete', () => {
blockGroupType: 'Document',
blocks: [],
},
[null!, null!, deleteList, backwardDeleteCollapsedSelection, deleteEmptyQuote],
[
null!,
null!,
deleteList,
backwardDeleteCollapsedSelection,
deleteEmptyQuote,
deleteParagraphStyle,
],
'notDeleted',
true,
0
Expand All @@ -128,7 +136,14 @@ describe('keyboardDelete', () => {
blockGroupType: 'Document',
blocks: [],
},
[null!, forwardDeleteWordSelection, null!, forwardDeleteCollapsedSelection, null!],
[
null!,
forwardDeleteWordSelection,
null!,
forwardDeleteCollapsedSelection,
null!,
deleteParagraphStyle,
],
'notDeleted',
true,
0
Expand All @@ -154,6 +169,7 @@ describe('keyboardDelete', () => {
deleteList,
backwardDeleteCollapsedSelection,
deleteEmptyQuote,
deleteParagraphStyle,
],
'notDeleted',
true,
Expand All @@ -174,7 +190,7 @@ describe('keyboardDelete', () => {
blockGroupType: 'Document',
blocks: [],
},
[null!, null!, null!, forwardDeleteCollapsedSelection, null!],
[null!, null!, null!, forwardDeleteCollapsedSelection, null!, deleteParagraphStyle],
'notDeleted',
true,
0
Expand All @@ -200,6 +216,7 @@ describe('keyboardDelete', () => {
deleteList,
backwardDeleteCollapsedSelection,
deleteEmptyQuote,
deleteParagraphStyle,
],
'notDeleted',
true,
Expand Down Expand Up @@ -242,7 +259,7 @@ describe('keyboardDelete', () => {
},
],
},
[null!, null!, null!, forwardDeleteCollapsedSelection, null!],
[null!, null!, null!, forwardDeleteCollapsedSelection, null!, deleteParagraphStyle],
'notDeleted',
true,
0
Expand Down Expand Up @@ -284,7 +301,14 @@ describe('keyboardDelete', () => {
},
],
},
[null!, null!, deleteList, backwardDeleteCollapsedSelection, deleteEmptyQuote],
[
null!,
null!,
deleteList,
backwardDeleteCollapsedSelection,
deleteEmptyQuote,
deleteParagraphStyle,
],
'notDeleted',
true,
0
Expand Down Expand Up @@ -336,7 +360,7 @@ describe('keyboardDelete', () => {
},
],
},
[null!, null!, null!, forwardDeleteCollapsedSelection, null!],
[null!, null!, null!, forwardDeleteCollapsedSelection, null!, deleteParagraphStyle],
'singleChar',
false,
1
Expand Down Expand Up @@ -388,7 +412,14 @@ describe('keyboardDelete', () => {
},
],
},
[null!, null!, deleteList, backwardDeleteCollapsedSelection, deleteEmptyQuote],
[
null!,
null!,
deleteList,
backwardDeleteCollapsedSelection,
deleteEmptyQuote,
deleteParagraphStyle,
],
'singleChar',
false,
1
Expand Down Expand Up @@ -482,7 +513,14 @@ describe('keyboardDelete', () => {
},
],
},
[null!, null!, deleteList, backwardDeleteCollapsedSelection, deleteEmptyQuote],
[
null!,
null!,
deleteList,
backwardDeleteCollapsedSelection,
deleteEmptyQuote,
deleteParagraphStyle,
],
'singleChar',
false,
1
Expand Down
Loading