Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
/**
* AutoLink edit feature, provides the ability to automatically convert text user typed or pasted
* in hyperlink format into a real hyperlink
*/
export const AutoLink: GenericContentEditFeature = {
keys: [Keys.ENTER, Keys.SPACE, Keys.CONTENTCHANGED],
shouldHandleEvent: cacheGetLinkData,
handleEvent: autoLink,
};
/**
* UnlinkWhenBackspaceAfterLink edit feature, provides the ability to convert a hyperlink back into text
* if user presses BACKSPACE right after a hyperlink
*/
export const UnlinkWhenBackspaceAfterLink: GenericContentEditFeature = {
keys: [Keys.BACKSPACE],
shouldHandleEvent: hasLinkBeforeCursor,
handleEvent: (event, editor) => {
event.rawEvent.preventDefault();
removeLink(editor);
},
};
function cacheGetLinkData(event: PluginEvent, editor: Editor): LinkData {
return event.eventType == PluginEventType.KeyDown ||
(event.eventType == PluginEventType.ContentChanged && event.source == ChangeSource.Paste)
? cacheGetEventData(event, 'LINK_DATA', () => {
// First try to match link from the whole paste string from the plain text in clipboard.
// This helps when we paste a link next to some existing character, and the text we got
// from clipboard will only contain what we pasted, any existing characters will not
// be included.
let clipboardData =
getTagOfNode,
isNodeEmpty,
splitBalancedNodeRange,
unwrap,
wrap,
} from 'roosterjs-editor-dom';
const QUOTE_TAG = 'BLOCKQUOTE';
const STRUCTURED_TAGS = [QUOTE_TAG, 'LI', 'TD', 'TH'].join(',');
/**
* UnquoteWhenBackOnEmpty1stLine edit feature, provides the ability to Unquote current line when
* user press BACKSPACE on first and empty line of a BLOCKQUOTE
*/
export const UnquoteWhenBackOnEmpty1stLine: ContentEditFeature = {
keys: [Keys.BACKSPACE],
shouldHandleEvent: (event, editor) => {
let childOfQuote = cacheGetQuoteChild(event, editor);
return childOfQuote && isNodeEmpty(childOfQuote) && !childOfQuote.previousSibling;
},
handleEvent: splitQuote,
};
/**
* UnquoteWhenEnterOnEmptyLine edit feature, provides the ability to Unquote current line when
* user press ENTER on an empty line of a BLOCKQUOTE
*/
export const UnquoteWhenEnterOnEmptyLine: ContentEditFeature = {
keys: [Keys.ENTER],
shouldHandleEvent: (event, editor) => {
let childOfQuote = cacheGetQuoteChild(event, editor);
let shift = event.rawEvent.shiftKey;
export const OutdentWhenShiftTab: ContentEditFeature = {
keys: [Keys.TAB],
shouldHandleEvent: (event, editor) =>
event.rawEvent.shiftKey && cacheGetListElement(event, editor),
handleEvent: (event, editor) => {
setIndentation(editor, Indentation.Decrease);
event.rawEvent.preventDefault();
},
};
/**
* MergeInNewLine edit feature, provides the ability to merge current line into a new line when user press
* BACKSPACE at beginning of a list item
*/
export const MergeInNewLine: ContentEditFeature = {
keys: [Keys.BACKSPACE],
shouldHandleEvent: (event, editor) => {
let li = cacheGetElementAtCursor(editor, event, 'LI');
let range = editor.getSelectionRange();
return li && range && isPositionAtBeginningOf(Position.getStart(range), li);
},
handleEvent: (event, editor) => {
let li = cacheGetElementAtCursor(editor, event, 'LI');
if (li.previousSibling) {
editor.runAsync(() => {
let br = editor.getDocument().createElement('BR');
editor.insertNode(br);
editor.select(br, PositionType.After);
});
} else {
toggleListAndPreventDefault(event, editor);
}