ngx-editor
Version:
Rich Text Editor for angular using ProseMirror
115 lines • 18.2 kB
JavaScript
import { keymap } from 'prosemirror-keymap';
import { toggleMark, baseKeymap, chainCommands, exitCode } from 'prosemirror-commands';
import { splitListItem, liftListItem, sinkListItem } from 'prosemirror-schema-list';
import { history, undo, redo } from 'prosemirror-history';
import { inputRules, wrappingInputRule, textblockTypeInputRule, smartQuotes, emDash, ellipsis } from 'prosemirror-inputrules';
import { markInputRule } from 'ngx-editor/helpers';
const isMacOs = typeof navigator !== 'undefined' ? /Mac/.test(navigator.platform) : false;
// Input rules ref: https://github.com/ProseMirror/prosemirror-example-setup/
// : (NodeType) → InputRule
// Given a blockquote node type, returns an input rule that turns `"> "`
// at the start of a textblock into a blockquote.
const blockQuoteRule = (nodeType) => {
return wrappingInputRule(/^\s*>\s$/, nodeType);
};
// : (NodeType) → InputRule
// Given a list node type, returns an input rule that turns a number
// followed by a dot at the start of a textblock into an ordered list.
const orderedListRule = (nodeType) => {
return wrappingInputRule(/^(\d+)\.\s$/, nodeType, match => ({ order: +match[1] }), (match, node) => node.childCount + node.attrs['order'] === +match[1]);
};
// : (NodeType) → InputRule
// Given a list node type, returns an input rule that turns a bullet
// (dash, plush, or asterisk) at the start of a textblock into a
// bullet list.
const bulletListRule = (nodeType) => {
return wrappingInputRule(/^\s*([-+*])\s$/, nodeType);
};
// : (NodeType) → InputRule
// Given a code block node type, returns an input rule that turns a
// textblock starting with three backticks into a code block.
const codeBlockRule = (nodeType) => {
return textblockTypeInputRule(/^```$/, nodeType);
};
// : (NodeType, number) → InputRule
// Given a node type and a maximum level, creates an input rule that
// turns up to that number of `#` characters followed by a space at
// the start of a textblock into a heading whose level corresponds to
// the number of `#` signs.
const headingRule = (nodeType, maxLevel) => {
return textblockTypeInputRule(new RegExp('^(#{1,' + maxLevel + '})\\s$'), nodeType, (match) => ({ level: match[1].length }));
};
// : (MarkType) → InputRule
// Wraps matching text with bold mark
const boldRule = (markType) => {
return markInputRule(/(?:^|\s)((?:\*\*|__)((?:[^*_]+))(?:\*\*|__))$/, markType);
};
// : (MarkType) → InputRule
// Wraps matching text with em mark
const emRule = (markType) => {
return markInputRule(/(?:^|\s)((?:\*|_)((?:[^*_]+))(?:\*|_))$/, markType);
};
// : (Schema) → Plugin
// A set of input rules for creating the basic block quotes, lists,
// code blocks, and heading.
const buildInputRules = (schema) => {
const rules = smartQuotes.concat(ellipsis, emDash);
rules.push(boldRule(schema.marks['strong']));
rules.push(emRule(schema.marks['em']));
rules.push(blockQuoteRule(schema.nodes['blockquote']));
rules.push(orderedListRule(schema.nodes['ordered_list']));
rules.push(bulletListRule(schema.nodes['bullet_list']));
rules.push(codeBlockRule(schema.nodes['code_block']));
rules.push(headingRule(schema.nodes['heading'], 6));
return inputRules({ rules });
};
const getKeyboardShortcuts = (schema, options) => {
const historyKeyMap = {};
historyKeyMap['Mod-z'] = undo;
if (isMacOs) {
historyKeyMap['Shift-Mod-z'] = redo;
}
else {
historyKeyMap['Mod-y'] = redo;
}
const plugins = [
keymap({
'Mod-b': toggleMark(schema.marks['strong']),
'Mod-i': toggleMark(schema.marks['em']),
'Mod-u': toggleMark(schema.marks['u']),
'Mod-`': toggleMark(schema.marks['code']),
}),
keymap({
Enter: splitListItem(schema.nodes['list_item']),
'Shift-Enter': chainCommands(exitCode, (state, dispatch) => {
const tr = state.tr;
const br = schema.nodes['hard_break'];
dispatch(tr.replaceSelectionWith(br.create()).scrollIntoView());
return true;
}),
'Mod-[': liftListItem(schema.nodes['list_item']),
'Mod-]': sinkListItem(schema.nodes['list_item']),
Tab: sinkListItem(schema.nodes['list_item'])
}),
keymap(baseKeymap)
];
if (options.history) {
plugins.push(keymap(historyKeyMap));
}
return plugins;
};
const getDefaultPlugins = (schema, options) => {
const plugins = [];
if (options.keyboardShortcuts) {
plugins.push(...getKeyboardShortcuts(schema, { history: options.history }));
}
if (options.history) {
plugins.push(history());
}
if (options.inputRules) {
plugins.push(buildInputRules(schema));
}
return plugins;
};
export default getDefaultPlugins;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdFBsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZWRpdG9yL3NyYy9saWIvZGVmYXVsdFBsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RixPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRixPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRCxPQUFPLEVBQ0wsVUFBVSxFQUFFLGlCQUFpQixFQUFFLHNCQUFzQixFQUNyRCxXQUFXLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFDOUIsTUFBTSx3QkFBd0IsQ0FBQztBQUVoQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFZbkQsTUFBTSxPQUFPLEdBQUcsT0FBTyxTQUFTLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFBO0FBRXpGLDZFQUE2RTtBQUU3RSwyQkFBMkI7QUFDM0Isd0VBQXdFO0FBQ3hFLGlEQUFpRDtBQUNqRCxNQUFNLGNBQWMsR0FBRyxDQUFDLFFBQWtCLEVBQWEsRUFBRTtJQUN2RCxPQUFPLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNqRCxDQUFDLENBQUM7QUFFRiwyQkFBMkI7QUFDM0Isb0VBQW9FO0FBQ3BFLHNFQUFzRTtBQUN0RSxNQUFNLGVBQWUsR0FBRyxDQUFDLFFBQWtCLEVBQWEsRUFBRTtJQUN4RCxP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Q0FBQyxDQUFDO0FBRUYsZUFBZSxpQkFBaUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1hcmtUeXBlLCBOb2RlVHlwZSwgU2NoZW1hIH0gZnJvbSAncHJvc2VtaXJyb3ItbW9kZWwnO1xuaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuaW1wb3J0IHsga2V5bWFwIH0gZnJvbSAncHJvc2VtaXJyb3Ita2V5bWFwJztcbmltcG9ydCB7IHRvZ2dsZU1hcmssIGJhc2VLZXltYXAsIGNoYWluQ29tbWFuZHMsIGV4aXRDb2RlIH0gZnJvbSAncHJvc2VtaXJyb3ItY29tbWFuZHMnO1xuaW1wb3J0IHsgc3BsaXRMaXN0SXRlbSwgbGlmdExpc3RJdGVtLCBzaW5rTGlzdEl0ZW0gfSBmcm9tICdwcm9zZW1pcnJvci1zY2hlbWEtbGlzdCc7XG5pbXBvcnQgeyBoaXN0b3J5LCB1bmRvLCByZWRvIH0gZnJvbSAncHJvc2VtaXJyb3ItaGlzdG9yeSc7XG5pbXBvcnQge1xuICBpbnB1dFJ1bGVzLCB3cmFwcGluZ0lucHV0UnVsZSwgdGV4dGJsb2NrVHlwZUlucHV0UnVsZSxcbiAgc21hcnRRdW90ZXMsIGVtRGFzaCwgZWxsaXBzaXMsIElucHV0UnVsZVxufSBmcm9tICdwcm9zZW1pcnJvci1pbnB1dHJ1bGVzJztcblxuaW1wb3J0IHsgbWFya0lucHV0UnVsZSB9IGZyb20gJ25neC1lZGl0b3IvaGVscGVycyc7XG5cbmludGVyZmFjZSBPcHRpb25zIHtcbiAgaGlzdG9yeTogYm9vbGVhbjtcbiAga2V5Ym9hcmRTaG9ydGN1dHM6IGJvb2xlYW47XG4gIGlucHV0UnVsZXM6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBTaG9ydGN1dE9wdGlvbnMge1xuICBoaXN0b3J5OiBib29sZWFuO1xufVxuXG5jb25zdCBpc01hY09zID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgPyAvTWFjLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSkgOiBmYWxzZVxuXG4vLyBJbnB1dCBydWxlcyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9Qcm9zZU1pcnJvci9wcm9zZW1pcnJvci1leGFtcGxlLXNldHVwL1xuXG4vLyA6IChOb2RlVHlwZSkg4oaSIElucHV0UnVsZVxuLy8gR2l2ZW4gYSBibG9ja3F1b3RlIG5vZGUgdHlwZSwgcmV0dXJucyBhbiBpbnB1dCBydWxlIHRoYXQgdHVybnMgYFwiPiBcImBcbi8vIGF0IHRoZSBzdGFydCBvZiBhIHRleHRibG9jayBpbnRvIGEgYmxvY2txdW90ZS5cbmNvbnN0IGJsb2NrUXVvdGVSdWxlID0gKG5vZGVUeXBlOiBOb2RlVHlwZSk6IElucHV0UnVsZSA9PiB7XG4gIHJldHVybiB3cmFwcGluZ0lucHV0UnVsZSgvXlxccyo+XFxzJC8sIG5vZGVUeXBlKTtcbn07XG5cbi8vIDogKE5vZGVUeXBlKSDihpIgSW5wdXRSdWxlXG4vLyBHaXZlbiBhIGxpc3Qgbm9kZSB0eXBlLCByZXR1cm5zIGFuIGlucHV0IHJ1bGUgdGhhdCB0dXJucyBhIG51bWJlclxuLy8gZm9sbG93ZWQgYnkgYSBkb3QgYXQgdGhlIHN0YXJ0IG9mIGEgdGV4dGJsb2NrIGludG8gYW4gb3JkZXJlZCBsaXN0LlxuY29uc3Qgb3JkZXJlZExpc3RSdWxlID0gKG5vZGVUeXBlOiBOb2RlVHlwZSk6IElucHV0UnVsZSA9PiB7XG4gIHJldHVybiB3cmFwcGluZ0lucHV0UnVsZShcbiAgICAvXihcXGQrKVxcLlxccyQvLFxuICAgIG5vZGVUeXBlLFxuICAgIG1hdGNoID0+ICh7IG9yZGVyOiArbWF0Y2hbMV0gfSksXG4gICAgKG1hdGNoLCBub2RlKSA9PiBub2RlLmNoaWxkQ291bnQgKyBub2RlLmF0dHJzWydvcmRlciddID09PSArbWF0Y2hbMV1cbiAgKTtcbn07XG5cbi8vIDogKE5vZGVUeXBlKSDihpIgSW5wdXRSdWxlXG4vLyBHaXZlbiBhIGxpc3Qgbm9kZSB0eXBlLCByZXR1cm5zIGFuIGlucHV0IHJ1bGUgdGhhdCB0dXJucyBhIGJ1bGxldFxuLy8gKGRhc2gsIHBsdXNoLCBvciBhc3RlcmlzaykgYXQgdGhlIHN0YXJ0IG9mIGEgdGV4dGJsb2NrIGludG8gYVxuLy8gYnVsbGV0IGxpc3QuXG5jb25zdCBidWxsZXRMaXN0UnVsZSA9IChub2RlVHlwZTogTm9kZVR5cGUpOiBJbnB1dFJ1bGUgPT4ge1xuICByZXR1cm4gd3JhcHBpbmdJbnB1dFJ1bGUoL15cXHMqKFstKypdKVxccyQvLCBub2RlVHlwZSk7XG59O1xuXG4vLyA6IChOb2RlVHlwZSkg4oaSIElucHV0UnVsZVxuLy8gR2l2ZW4gYSBjb2RlIGJsb2NrIG5vZGUgdHlwZSwgcmV0dXJucyBhbiBpbnB1dCBydWxlIHRoYXQgdHVybnMgYVxuLy8gdGV4dGJsb2NrIHN0YXJ0aW5nIHdpdGggdGhyZWUgYmFja3RpY2tzIGludG8gYSBjb2RlIGJsb2NrLlxuY29uc3QgY29kZUJsb2NrUnVsZSA9IChub2RlVHlwZTogTm9kZVR5cGUpOiBJbnB1dFJ1bGUgPT4ge1xuICByZXR1cm4gdGV4dGJsb2NrVHlwZUlucHV0UnVsZSgvXmBgYCQvLCBub2RlVHlwZSk7XG59O1xuXG4vLyA6IChOb2RlVHlwZSwgbnVtYmVyKSDihpIgSW5wdXRSdWxlXG4vLyBHaXZlbiBhIG5vZGUgdHlwZSBhbmQgYSBtYXhpbXVtIGxldmVsLCBjcmVhdGVzIGFuIGlucHV0IHJ1bGUgdGhhdFxuLy8gdHVybnMgdXAgdG8gdGhhdCBudW1iZXIgb2YgYCNgIGNoYXJhY3RlcnMgZm9sbG93ZWQgYnkgYSBzcGFjZSBhdFxuLy8gdGhlIHN0YXJ0IG9mIGEgdGV4dGJsb2NrIGludG8gYSBoZWFkaW5nIHdob3NlIGxldmVsIGNvcnJlc3BvbmRzIHRvXG4vLyB0aGUgbnVtYmVyIG9mIGAjYCBzaWducy5cbmNvbnN0IGhlYWRpbmdSdWxlID0gKG5vZGVUeXBlOiBOb2RlVHlwZSwgbWF4TGV2ZWw6IG51bWJlcik6IElucHV0UnVsZSA9PiB7XG4gIHJldHVybiB0ZXh0YmxvY2tUeXBlSW5wdXRSdWxlKFxuICAgIG5ldyBSZWdFeHAoJ14oI3sxLCcgKyBtYXhMZXZlbCArICd9KVxcXFxzJCcpLFxuICAgIG5vZGVUeXBlLFxuICAgIChtYXRjaCkgPT4gKHsgbGV2ZWw6IG1hdGNoWzFdLmxlbmd0aCB9KVxuICApO1xufTtcblxuLy8gOiAoTWFya1R5cGUpIOKGkiBJbnB1dFJ1bGVcbi8vIFdyYXBzIG1hdGNoaW5nIHRleHQgd2l0aCBib2xkIG1hcmtcbmNvbnN0IGJvbGRSdWxlID0gKG1hcmtUeXBlOiBNYXJrVHlwZSk6IElucHV0UnVsZSA9PiB7XG4gIHJldHVybiBtYXJrSW5wdXRSdWxlKC8oPzpefFxccykoKD86XFwqXFwqfF9fKSgoPzpbXipfXSspKSg/OlxcKlxcKnxfXykpJC8sIG1hcmtUeXBlKVxufVxuXG4vLyA6IChNYXJrVHlwZSkg4oaSIElucHV0UnVsZVxuLy8gV3JhcHMgbWF0Y2hpbmcgdGV4dCB3aXRoIGVtIG1hcmtcbmNvbnN0IGVtUnVsZSA9IChtYXJrVHlwZTogTWFya1R5cGUpOiBJbnB1dFJ1bGUgPT4ge1xuICByZXR1cm4gbWFya0lucHV0UnVsZSgvKD86XnxcXHMpKCg/OlxcKnxfKSgoPzpbXipfXSspKSg/OlxcKnxfKSkkLywgbWFya1R5cGUpXG59XG5cbi8vIDogKFNjaGVtYSkg4oaSIFBsdWdpblxuLy8gQSBzZXQgb2YgaW5wdXQgcnVsZXMgZm9yIGNyZWF0aW5nIHRoZSBiYXNpYyBibG9jayBxdW90ZXMsIGxpc3RzLFxuLy8gY29kZSBibG9ja3MsIGFuZCBoZWFkaW5nLlxuY29uc3QgYnVpbGRJbnB1dFJ1bGVzID0gKHNjaGVtYTogU2NoZW1hKTogUGx1Z2luID0+IHtcbiAgY29uc3QgcnVsZXMgPSBzbWFydFF1b3Rlcy5jb25jYXQoZWxsaXBzaXMsIGVtRGFzaCk7XG5cbiAgcnVsZXMucHVzaChib2xkUnVsZShzY2hlbWEubWFya3NbJ3N0cm9uZyddKSk7XG4gIHJ1bGVzLnB1c2goZW1SdWxlKHNjaGVtYS5tYXJrc1snZW0nXSkpO1xuICBydWxlcy5wdXNoKGJsb2NrUXVvdGVSdWxlKHNjaGVtYS5ub2Rlc1snYmxvY2txdW90ZSddKSk7XG4gIHJ1bGVzLnB1c2gob3JkZXJlZExpc3RSdWxlKHNjaGVtYS5ub2Rlc1snb3JkZXJlZF9saXN0J10pKTtcbiAgcnVsZXMucHVzaChidWxsZXRMaXN0UnVsZShzY2hlbWEubm9kZXNbJ2J1bGxldF9saXN0J10pKTtcbiAgcnVsZXMucHVzaChjb2RlQmxvY2tSdWxlKHNjaGVtYS5ub2Rlc1snY29kZV9ibG9jayddKSk7XG4gIHJ1bGVzLnB1c2goaGVhZGluZ1J1bGUoc2NoZW1hLm5vZGVzWydoZWFkaW5nJ10sIDYpKTtcblxuICByZXR1cm4gaW5wdXRSdWxlcyh7IHJ1bGVzIH0pO1xufTtcblxuY29uc3QgZ2V0S2V5Ym9hcmRTaG9ydGN1dHMgPSAoc2NoZW1hOiBTY2hlbWEsIG9wdGlvbnM6IFNob3J0Y3V0T3B0aW9ucykgPT4ge1xuICBjb25zdCBoaXN0b3J5S2V5TWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cbiAgaGlzdG9yeUtleU1hcFsnTW9kLXonXSA9IHVuZG87XG4gIGlmIChpc01hY09zKSB7XG4gICAgaGlzdG9yeUtleU1hcFsnU2hpZnQtTW9kLXonXSA9IHJlZG87XG4gIH0gZWxzZSB7XG4gICAgaGlzdG9yeUtleU1hcFsnTW9kLXknXSA9IHJlZG87XG4gIH1cblxuICBjb25zdCBwbHVnaW5zID0gW1xuICAgIGtleW1hcCh7XG4gICAgICAnTW9kLWInOiB0b2dnbGVNYXJrKHNjaGVtYS5tYXJrc1snc3Ryb25nJ10pLFxuICAgICAgJ01vZC1pJzogdG9nZ2xlTWFyayhzY2hlbWEubWFya3NbJ2VtJ10pLFxuICAgICAgJ01vZC11JzogdG9nZ2xlTWFyayhzY2hlbWEubWFya3NbJ3UnXSksXG4gICAgICAnTW9kLWAnOiB0b2dnbGVNYXJrKHNjaGVtYS5tYXJrc1snY29kZSddKSxcbiAgICB9KSxcbiAgICBrZXltYXAoe1xuICAgICAgRW50ZXI6IHNwbGl0TGlzdEl0ZW0oc2NoZW1hLm5vZGVzWydsaXN0X2l0ZW0nXSksXG4gICAgICAnU2hpZnQtRW50ZXInOiBjaGFpbkNvbW1hbmRzKGV4aXRDb2RlLCAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRyID0gc3RhdGUudHI7XG4gICAgICAgIGNvbnN0IGJyID0gc2NoZW1hLm5vZGVzWydoYXJkX2JyZWFrJ107XG4gICAgICAgIGRpc3BhdGNoKHRyLnJlcGxhY2VTZWxlY3Rpb25XaXRoKGJyLmNyZWF0ZSgpKS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9KSxcbiAgICAgICdNb2QtWyc6IGxpZnRMaXN0SXRlbShzY2hlbWEubm9kZXNbJ2xpc3RfaXRlbSddKSxcbiAgICAgICdNb2QtXSc6IHNpbmtMaXN0SXRlbShzY2hlbWEubm9kZXNbJ2xpc3RfaXRlbSddKSxcbiAgICAgIFRhYjogc2lua0xpc3RJdGVtKHNjaGVtYS5ub2Rlc1snbGlzdF9pdGVtJ10pXG4gICAgfSksXG4gICAga2V5bWFwKGJhc2VLZXltYXApXG4gIF07XG5cbiAgaWYgKG9wdGlvbnMuaGlzdG9yeSkge1xuICAgIHBsdWdpbnMucHVzaChrZXltYXAoaGlzdG9yeUtleU1hcCkpO1xuICB9XG5cbiAgcmV0dXJuIHBsdWdpbnM7XG59O1xuXG5jb25zdCBnZXREZWZhdWx0UGx1Z2lucyA9IChzY2hlbWE6IFNjaGVtYSwgb3B0aW9uczogT3B0aW9ucyk6IFBsdWdpbltdID0+IHtcbiAgY29uc3QgcGx1Z2luczogUGx1Z2luW10gPSBbXTtcblxuICBpZiAob3B0aW9ucy5rZXlib2FyZFNob3J0Y3V0cykge1xuICAgIHBsdWdpbnMucHVzaCguLi5nZXRLZXlib2FyZFNob3J0Y3V0cyhzY2hlbWEsIHsgaGlzdG9yeTogb3B0aW9ucy5oaXN0b3J5IH0pKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmhpc3RvcnkpIHtcbiAgICBwbHVnaW5zLnB1c2goaGlzdG9yeSgpKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmlucHV0UnVsZXMpIHtcbiAgICBwbHVnaW5zLnB1c2goYnVpbGRJbnB1dFJ1bGVzKHNjaGVtYSkpO1xuICB9XG5cbiAgcmV0dXJuIHBsdWdpbnM7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBnZXREZWZhdWx0UGx1Z2lucztcbiJdfQ==