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 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | 1x 1x 3x 3x 1x 1x 3x 1x 1x 1x 3x 1x 4x 4x 4x 4x 4x 4x 4x 1x 1x 3x | import { isCtrlOrMetaPressed } from 'roosterjs-editor-dom'; import { Keys, PluginEventType } from 'roosterjs-editor-types'; import type { EditPluginState, GenericContentEditFeature, IEditor, PluginEvent, PluginWithState, } from 'roosterjs-editor-types'; /** * Edit Component helps handle Content edit features */ class EditPlugin implements PluginWithState<EditPluginState> { private editor: IEditor | null = null; private state: EditPluginState; /** * Construct a new instance of EditPlugin * @param options The editor options */ constructor() { this.state = { features: {}, }; } /** * Get a friendly name of this plugin */ getName() { return 'Edit'; } /** * Initialize this plugin. This should only be called from Editor * @param editor Editor instance */ initialize(editor: IEditor) { this.editor = editor; } /** * Dispose this plugin */ dispose() { this.editor = null; } /** * Get plugin state object */ getState() { return this.state; } /** * Handle events triggered from editor * @param event PluginEvent object */ onPluginEvent(event: PluginEvent) { let hasFunctionKey = false; let features: GenericContentEditFeature<PluginEvent>[] | null = null; let ctrlOrMeta = false; const isKeyDownEvent = event.eventType == PluginEventType.KeyDown; Iif (isKeyDownEvent) { const rawEvent = event.rawEvent; const range = this.editor?.getSelectionRange(); ctrlOrMeta = isCtrlOrMetaPressed(rawEvent); hasFunctionKey = ctrlOrMeta || rawEvent.altKey; features = this.state.features[rawEvent.which] || (range && !range.collapsed && this.state.features[Keys.RANGE]); } else Iif (event.eventType == PluginEventType.ContentChanged) { features = this.state.features[Keys.CONTENTCHANGED]; } for (let i = 0; features && i < features?.length; i++) { const feature = features[i]; if ( (feature.allowFunctionKeys || !hasFunctionKey) && this.editor && feature.shouldHandleEvent(event, this.editor, ctrlOrMeta) ) { feature.handleEvent(event, this.editor); if (isKeyDownEvent) { event.handledByEditFeature = true; } break; } } } } /** * @internal * Create a new instance of EditPlugin. */ export function createEditPlugin(): PluginWithState<EditPluginState> { return new EditPlugin(); } |