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: Number(match[1]) }), (match, node) => node.childCount + node.attrs['order'] === Number(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 }); }; export 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; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdFBsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZWRpdG9yL3NyYy9saWIvZGVmYXVsdFBsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RixPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRixPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRCxPQUFPLEVBQ0wsVUFBVSxFQUFFLGlCQUFpQixFQUFFLHNCQUFzQixFQUNyRCxXQUFXLEVBQUUsTUFBTSxFQUFFLFFBQVEsR0FDOUIsTUFBTSx3QkFBd0IsQ0FBQztBQUVoQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFZbkQsTUFBTSxPQUFPLEdBQUcsT0FBTyxTQUFTLEtBQUssV0FBVztJQUM5QyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztJQUNsQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBRVYsNkVBQTZFO0FBRTdFLDJCQUEyQjtBQUMzQix3RUFBd0U7QUFDeEUsaURBQWlEO0FBQ2pELE1BQU0sY0FBYyxHQUFHLENBQUMsUUFBa0IsRUFBYSxFQUFFO0lBQ3ZELE9BQU8saUJBQWlCLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ2pELENBQUMsQ0FBQztBQUVGLDJCQUEyQjtBQUMzQixvRUFBb0U7QUFDcEUsc0VBQXNFO0FBQ3RFLE1BQU0sZUFBZSxHQUFHLENBQUMsUUFBa0IsRUFBYSxF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QUFDO0tBQ3ZDO0lBRUQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyxDQUFDO0FBRUYsZUFBZSxpQkFBaUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1hcmtUeXBlLCBOb2RlVHlwZSwgU2NoZW1hIH0gZnJvbSAncHJvc2VtaXJyb3ItbW9kZWwnO1xuaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuaW1wb3J0IHsga2V5bWFwIH0gZnJvbSAncHJvc2VtaXJyb3Ita2V5bWFwJztcbmltcG9ydCB7IHRvZ2dsZU1hcmssIGJhc2VLZXltYXAsIGNoYWluQ29tbWFuZHMsIGV4aXRDb2RlIH0gZnJvbSAncHJvc2VtaXJyb3ItY29tbWFuZHMnO1xuaW1wb3J0IHsgc3BsaXRMaXN0SXRlbSwgbGlmdExpc3RJdGVtLCBzaW5rTGlzdEl0ZW0gfSBmcm9tICdwcm9zZW1pcnJvci1zY2hlbWEtbGlzdCc7XG5pbXBvcnQgeyBoaXN0b3J5LCB1bmRvLCByZWRvIH0gZnJvbSAncHJvc2VtaXJyb3ItaGlzdG9yeSc7XG5pbXBvcnQge1xuICBpbnB1dFJ1bGVzLCB3cmFwcGluZ0lucHV0UnVsZSwgdGV4dGJsb2NrVHlwZUlucHV0UnVsZSxcbiAgc21hcnRRdW90ZXMsIGVtRGFzaCwgZWxsaXBzaXMsIElucHV0UnVsZSxcbn0gZnJvbSAncHJvc2VtaXJyb3ItaW5wdXRydWxlcyc7XG5cbmltcG9ydCB7IG1hcmtJbnB1dFJ1bGUgfSBmcm9tICduZ3gtZWRpdG9yL2hlbHBlcnMnO1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGhpc3Rvcnk6IGJvb2xlYW47XG4gIGtleWJvYXJkU2hvcnRjdXRzOiBib29sZWFuO1xuICBpbnB1dFJ1bGVzOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgU2hvcnRjdXRPcHRpb25zIHtcbiAgaGlzdG9yeTogYm9vbGVhbjtcbn1cblxuY29uc3QgaXNNYWNPcyA9IHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnXG4gID8gKC9NYWMvKS50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSlcbiAgOiBmYWxzZTtcblxuLy8gSW5wdXQgcnVsZXMgcmVmOiBodHRwczovL2dpdGh1Yi5jb20vUHJvc2VNaXJyb3IvcHJvc2VtaXJyb3ItZXhhbXBsZS1zZXR1cC9cblxuLy8gOiAoTm9kZVR5cGUpIOKGkiBJbnB1dFJ1bGVcbi8vIEdpdmVuIGEgYmxvY2txdW90ZSBub2RlIHR5cGUsIHJldHVybnMgYW4gaW5wdXQgcnVsZSB0aGF0IHR1cm5zIGBcIj4gXCJgXG4vLyBhdCB0aGUgc3RhcnQgb2YgYSB0ZXh0YmxvY2sgaW50byBhIGJsb2NrcXVvdGUuXG5jb25zdCBibG9ja1F1b3RlUnVsZSA9IChub2RlVHlwZTogTm9kZVR5cGUpOiBJbnB1dFJ1bGUgPT4ge1xuICByZXR1cm4gd3JhcHBpbmdJbnB1dFJ1bGUoL15cXHMqPlxccyQvLCBub2RlVHlwZSk7XG59O1xuXG4vLyA6IChOb2RlVHlwZSkg4oaSIElucHV0UnVsZVxuLy8gR2l2ZW4gYSBsaXN0IG5vZGUgdHlwZSwgcmV0dXJucyBhbiBpbnB1dCBydWxlIHRoYXQgdHVybnMgYSBudW1iZXJcbi8vIGZvbGxvd2VkIGJ5IGEgZG90IGF0IHRoZSBzdGFydCBvZiBhIHRleHRibG9jayBpbnRvIGFuIG9yZGVyZWQgbGlzdC5cbmNvbnN0IG9yZGVyZWRMaXN0UnVsZSA9IChub2RlVHlwZTogTm9kZVR5cGUpOiBJbnB1dFJ1bGUgPT4ge1xuICByZXR1cm4gd3JhcHBpbmdJbnB1dFJ1bGUoXG4gICAgL14oPzpcXGQrKVxcLlxccyQvLFxuICAgIG5vZGVUeXBlLFxuICAgIChtYXRjaCkgPT4gKHsgb3JkZXI6IE51bWJlcihtYXRjaFsxXSkgfSksXG4gICAgKG1hdGNoLCBub2RlKSA9PiBub2RlLmNoaWxkQ291bnQgKyBub2RlLmF0dHJzWydvcmRlciddID09PSBOdW1iZXIobWF0Y2hbMV0pLFxuICApO1xufTtcblxuLy8gOiAoTm9kZVR5cGUpIOKGkiBJbnB1dFJ1bGVcbi8vIEdpdmVuIGEgbGlzdCBub2RlIHR5cGUsIHJldHVybnMgYW4gaW5wdXQgcnVsZSB0aGF0IHR1cm5zIGEgYnVsbGV0XG4vLyAoZGFzaCwgcGx1c2gsIG9yIGFzdGVyaXNrKSBhdCB0aGUgc3RhcnQgb2YgYSB0ZXh0YmxvY2sgaW50byBhXG4vLyBidWxsZXQgbGlzdC5cbmNvbnN0IGJ1bGxldExpc3RSdWxlID0gKG5vZGVUeXBlOiBOb2RlVHlwZSk6IElucHV0UnVsZSA9PiB7XG4gIHJldHVybiB3cmFwcGluZ0lucHV0UnVsZSgvXlxccyooPzpbLSsqXSlcXHMkLywgbm9kZVR5cGUpO1xufTtcblxuLy8gOiAoTm9kZVR5cGUpIOKGkiBJbnB1dFJ1bGVcbi8vIEdpdmVuIGEgY29kZSBibG9jayBub2RlIHR5cGUsIHJldHVybnMgYW4gaW5wdXQgcnVsZSB0aGF0IHR1cm5zIGFcbi8vIHRleHRibG9jayBzdGFydGluZyB3aXRoIHRocmVlIGJhY2t0aWNrcyBpbnRvIGEgY29kZSBibG9jay5cbmNvbnN0IGNvZGVCbG9ja1J1bGUgPSAobm9kZVR5cGU6IE5vZGVUeXBlKTogSW5wdXRSdWxlID0+IHtcbiAgcmV0dXJuIHRleHRibG9ja1R5cGVJbnB1dFJ1bGUoL15gYGAkLywgbm9kZVR5cGUpO1xufTtcblxuLy8gOiAoTm9kZVR5cGUsIG51bWJlcikg4oaSIElucHV0UnVsZVxuLy8gR2l2ZW4gYSBub2RlIHR5cGUgYW5kIGEgbWF4aW11bSBsZXZlbCwgY3JlYXRlcyBhbiBpbnB1dCBydWxlIHRoYXRcbi8vIHR1cm5zIHVwIHRvIHRoYXQgbnVtYmVyIG9mIGAjYCBjaGFyYWN0ZXJzIGZvbGxvd2VkIGJ5IGEgc3BhY2UgYXRcbi8vIHRoZSBzdGFydCBvZiBhIHRleHRibG9jayBpbnRvIGEgaGVhZGluZyB3aG9zZSBsZXZlbCBjb3JyZXNwb25kcyB0b1xuLy8gdGhlIG51bWJlciBvZiBgI2Agc2lnbnMuXG5jb25zdCBoZWFkaW5nUnVsZSA9IChub2RlVHlwZTogTm9kZVR5cGUsIG1heExldmVsOiBudW1iZXIpOiBJbnB1dFJ1bGUgPT4ge1xuICByZXR1cm4gdGV4dGJsb2NrVHlwZUlucHV0UnVsZShcbiAgICBuZXcgUmVnRXhwKGBeKCN7MSwke21heExldmVsfX0pXFxcXHMkYCksXG4gICAgbm9kZVR5cGUsXG4gICAgKG1hdGNoKSA9PiAoeyBsZXZlbDogbWF0Y2hbMV0ubGVuZ3RoIH0pLFxuICApO1xufTtcblxuLy8gOiAoTWFya1R5cGUpIOKGkiBJbnB1dFJ1bGVcbi8vIFdyYXBzIG1hdGNoaW5nIHRleHQgd2l0aCBib2xkIG1hcmtcbmNvbnN0IGJvbGRSdWxlID0gKG1hcmtUeXBlOiBNYXJrVHlwZSk6IElucHV0UnVsZSA9PiB7XG4gIHJldHVybiBtYXJrSW5wdXRSdWxlKC8oPzpefFxccykoPzooPzpcXCpcXCp8X18pKD86KD86W14qX10rKSkoPzpcXCpcXCp8X18pKSQvLCBtYXJrVHlwZSk7XG59O1xuXG4vLyA6IChNYXJrVHlwZSkg4oaSIElucHV0UnVsZVxuLy8gV3JhcHMgbWF0Y2hpbmcgdGV4dCB3aXRoIGVtIG1hcmtcbmNvbnN0IGVtUnVsZSA9IChtYXJrVHlwZTogTWFya1R5cGUpOiBJbnB1dFJ1bGUgPT4ge1xuICByZXR1cm4gbWFya0lucHV0UnVsZSgvKD86XnxcXHMpKD86KD86XFwqfF8pKD86KD86W14qX10rKSkoPzpcXCp8XykpJC8sIG1hcmtUeXBlKTtcbn07XG5cbi8vIDogKFNjaGVtYSkg4oaSIFBsdWdpblxuLy8gQSBzZXQgb2YgaW5wdXQgcnVsZXMgZm9yIGNyZWF0aW5nIHRoZSBiYXNpYyBibG9jayBxdW90ZXMsIGxpc3RzLFxuLy8gY29kZSBibG9ja3MsIGFuZCBoZWFkaW5nLlxuY29uc3QgYnVpbGRJbnB1dFJ1bGVzID0gKHNjaGVtYTogU2NoZW1hKTogUGx1Z2luID0+IHtcbiAgY29uc3QgcnVsZXMgPSBzbWFydFF1b3Rlcy5jb25jYXQoZWxsaXBzaXMsIGVtRGFzaCk7XG5cbiAgcnVsZXMucHVzaChib2xkUnVsZShzY2hlbWEubWFya3NbJ3N0cm9uZyddKSk7XG4gIHJ1bGVzLnB1c2goZW1SdWxlKHNjaGVtYS5tYXJrc1snZW0nXSkpO1xuICBydWxlcy5wdXNoKGJsb2NrUXVvdGVSdWxlKHNjaGVtYS5ub2Rlc1snYmxvY2txdW90ZSddKSk7XG4gIHJ1bGVzLnB1c2gob3JkZXJlZExpc3RSdWxlKHNjaGVtYS5ub2Rlc1snb3JkZXJlZF9saXN0J10pKTtcbiAgcnVsZXMucHVzaChidWxsZXRMaXN0UnVsZShzY2hlbWEubm9kZXNbJ2J1bGxldF9saXN0J10pKTtcbiAgcnVsZXMucHVzaChjb2RlQmxvY2tSdWxlKHNjaGVtYS5ub2Rlc1snY29kZV9ibG9jayddKSk7XG4gIHJ1bGVzLnB1c2goaGVhZGluZ1J1bGUoc2NoZW1hLm5vZGVzWydoZWFkaW5nJ10sIDYpKTtcblxuICByZXR1cm4gaW5wdXRSdWxlcyh7IHJ1bGVzIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEtleWJvYXJkU2hvcnRjdXRzID0gKHNjaGVtYTogU2NoZW1hLCBvcHRpb25zOiBTaG9ydGN1dE9wdGlvbnMpID0+IHtcbiAgY29uc3QgaGlzdG9yeUtleU1hcDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gIGhpc3RvcnlLZXlNYXBbJ01vZC16J10gPSB1bmRvO1xuICBpZiAoaXNNYWNPcykge1xuICAgIGhpc3RvcnlLZXlNYXBbJ1NoaWZ0LU1vZC16J10gPSByZWRvO1xuICB9IGVsc2Uge1xuICAgIGhpc3RvcnlLZXlNYXBbJ01vZC15J10gPSByZWRvO1xuICB9XG5cbiAgY29uc3QgcGx1Z2lucyA9IFtcbiAgICBrZXltYXAoe1xuICAgICAgJ01vZC1iJzogdG9nZ2xlTWFyayhzY2hlbWEubWFya3NbJ3N0cm9uZyddKSxcbiAgICAgICdNb2QtaSc6IHRvZ2dsZU1hcmsoc2NoZW1hLm1hcmtzWydlbSddKSxcbiAgICAgICdNb2QtdSc6IHRvZ2dsZU1hcmsoc2NoZW1hLm1hcmtzWyd1J10pLFxuICAgICAgJ01vZC1gJzogdG9nZ2xlTWFyayhzY2hlbWEubWFya3NbJ2NvZGUnXSksXG4gICAgfSksXG4gICAga2V5bWFwKHtcbiAgICAgICdFbnRlcic6IHNwbGl0TGlzdEl0ZW0oc2NoZW1hLm5vZGVzWydsaXN0X2l0ZW0nXSksXG4gICAgICAnU2hpZnQtRW50ZXInOiBjaGFpbkNvbW1hbmRzKGV4aXRDb2RlLCAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdHIgfSA9IHN0YXRlO1xuICAgICAgICBjb25zdCBiciA9IHNjaGVtYS5ub2Rlc1snaGFyZF9icmVhayddO1xuICAgICAgICBkaXNwYXRjaCh0ci5yZXBsYWNlU2VsZWN0aW9uV2l0aChici5jcmVhdGUoKSkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSksXG4gICAgICAnTW9kLVsnOiBsaWZ0TGlzdEl0ZW0oc2NoZW1hLm5vZGVzWydsaXN0X2l0ZW0nXSksXG4gICAgICAnTW9kLV0nOiBzaW5rTGlzdEl0ZW0oc2NoZW1hLm5vZGVzWydsaXN0X2l0ZW0nXSksXG4gICAgICAnVGFiJzogc2lua0xpc3RJdGVtKHNjaGVtYS5ub2Rlc1snbGlzdF9pdGVtJ10pLFxuICAgIH0pLFxuICAgIGtleW1hcChiYXNlS2V5bWFwKSxcbiAgXTtcblxuICBpZiAob3B0aW9ucy5oaXN0b3J5KSB7XG4gICAgcGx1Z2lucy5wdXNoKGtleW1hcChoaXN0b3J5S2V5TWFwKSk7XG4gIH1cblxuICByZXR1cm4gcGx1Z2lucztcbn07XG5cbmNvbnN0IGdldERlZmF1bHRQbHVnaW5zID0gKHNjaGVtYTogU2NoZW1hLCBvcHRpb25zOiBPcHRpb25zKTogUGx1Z2luW10gPT4ge1xuICBjb25zdCBwbHVnaW5zOiBQbHVnaW5bXSA9IFtdO1xuXG4gIGlmIChvcHRpb25zLmtleWJvYXJkU2hvcnRjdXRzKSB7XG4gICAgcGx1Z2lucy5wdXNoKC4uLmdldEtleWJvYXJkU2hvcnRjdXRzKHNjaGVtYSwgeyBoaXN0b3J5OiBvcHRpb25zLmhpc3RvcnkgfSkpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuaGlzdG9yeSkge1xuICAgIHBsdWdpbnMucHVzaChoaXN0b3J5KCkpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuaW5wdXRSdWxlcykge1xuICAgIHBsdWdpbnMucHVzaChidWlsZElucHV0UnVsZXMoc2NoZW1hKSk7XG4gIH1cblxuICByZXR1cm4gcGx1Z2lucztcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGdldERlZmF1bHRQbHVnaW5zO1xuIl19