@atlaskit/editor-core
Version:
A package contains Atlassian editor core functionality
33 lines (27 loc) • 1.54 kB
text/typescript
import { InputRule, EditorState, Transaction } from '../prosemirror';
export type InputRuleHandler<T> = (state: EditorState<T>, match, start, end) => (Transaction | undefined) | string;
export function defaultInputRuleHandler(inputRule: InputRule): InputRule {
const originalHandler = inputRule.handler;
inputRule.handler = (state: EditorState<any>, match, start, end) => {
// Skip any input rule inside code
// https://product-fabric.atlassian.net/wiki/spaces/E/pages/37945345/Editor+content+feature+rules#Editorcontent/featurerules-Rawtextblocks
if (state.selection.$from.parent.type.spec.code) {
return;
}
return originalHandler(state, match, start, end);
};
return inputRule;
}
export function createInputRule(match: RegExp, handler: InputRuleHandler<any>): InputRule {
return defaultInputRuleHandler(new InputRule(match, handler));
}
// ProseMirror uses the Unicode Character 'OBJECT REPLACEMENT CHARACTER' (U+FFFC) as text representation for
// leaf nodes, i.e. nodes that don't have any content or text property (e.g. hardBreak, emoji, mention, rule)
// It was introduced because of https://github.com/ProseMirror/prosemirror/issues/262
// This can be used in an input rule regex to be able to include or exclude such nodes.
export const leafNodeReplacementCharacter = '\ufffc';
// tslint:disable:no-bitwise
export const uuid = () => 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
const r = Math.random() * 16 | 0;
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
});