Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 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 70 71 72 73 74 | 1x 1x 1x 1x 1x 1x 68x 36x 36x 36x 36x 36x 36x 36x 35x 36x 36x 33x 33x 33x 33x 3x 2x 2x | import { deleteEmptyQuote } from './deleteSteps/deleteEmptyQuote';
import { handleAutoLink } from './inputSteps/handleAutoLink';
import { handleEnterOnList } from './inputSteps/handleEnterOnList';
import { handleEnterOnParagraph } from './inputSteps/handleEnterOnParagraph';
import {
ChangeSource,
deleteSelection,
normalizeContentModel,
runEditSteps,
} from 'roosterjs-content-model-dom';
import type { IEditor, ReadonlyContentModelParagraph } from 'roosterjs-content-model-types';
/**
* @internal
*/
export function keyboardEnter(
editor: IEditor,
rawEvent: KeyboardEvent,
handleNormalEnter: boolean,
formatsToPreserveOnMerge: string[] = []
) {
const selection = editor.getDOMSelection();
editor.formatContentModel(
(model, context) => {
// 1. delete the expanded selection if any, then merge paragraph
const result = deleteSelection(model, [], context);
// 2. Add line break
Eif (selection && selection.type != 'table') {
// For ENTER key, although we may have deleted something, since we still need to split the line, we always treat it as not delete
// so further delete steps can keep working
result.deleteResult = 'notDeleted';
const steps = rawEvent.shiftKey
? []
: [handleAutoLink, handleEnterOnList, deleteEmptyQuote];
if (handleNormalEnter || handleEnterForEntity(result.insertPoint?.paragraph)) {
steps.push(handleEnterOnParagraph(formatsToPreserveOnMerge));
}
runEditSteps(steps, result);
}
if (result.deleteResult == 'range') {
// We have deleted something, next input should inherit the segment format from deleted content, so set pending format here
context.newPendingFormat = result.insertPoint?.marker.format;
normalizeContentModel(model);
rawEvent.preventDefault();
return true;
} else {
return false;
}
},
{
rawEvent,
scrollCaretIntoView: true,
changeSource: ChangeSource.Keyboard,
getChangeData: () => rawEvent.which,
apiName: 'handleEnterKey',
}
);
}
function handleEnterForEntity(paragraph: ReadonlyContentModelParagraph | undefined) {
return (
paragraph &&
(paragraph.isImplicit || paragraph.segments.some(x => x.segmentType == 'Entity'))
);
}
|