@portabletext/plugin-markdown-shortcuts 1.1.4 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +47 -58
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +50 -59
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
- package/src/behavior.markdown-shortcuts.ts +1 -74
- package/src/plugin.markdown-shortcuts.tsx +7 -0
- package/src/rule.horizontal-rule.ts +61 -0
package/dist/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: !0 });
|
|
3
|
-
var jsxRuntime = require("react/jsx-runtime"), compilerRuntime = require("react/compiler-runtime"), editor = require("@portabletext/editor"), pluginCharacterPairDecorator = require("@portabletext/plugin-character-pair-decorator"), react = require("react"), behaviors = require("@portabletext/editor/behaviors"), selectors = require("@portabletext/editor/selectors"), utils = require("@portabletext/editor/utils");
|
|
3
|
+
var jsxRuntime = require("react/jsx-runtime"), compilerRuntime = require("react/compiler-runtime"), editor = require("@portabletext/editor"), pluginCharacterPairDecorator = require("@portabletext/plugin-character-pair-decorator"), pluginInputRule = require("@portabletext/plugin-input-rule"), react = require("react"), behaviors = require("@portabletext/editor/behaviors"), selectors = require("@portabletext/editor/selectors"), utils = require("@portabletext/editor/utils");
|
|
4
4
|
function _interopNamespaceCompat(e) {
|
|
5
5
|
if (e && typeof e == "object" && "default" in e) return e;
|
|
6
6
|
var n = /* @__PURE__ */ Object.create(null);
|
|
@@ -79,64 +79,13 @@ function createMarkdownBehaviors(config) {
|
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
81
|
})]]
|
|
82
|
-
}), automaticHr = behaviors.defineBehavior({
|
|
83
|
-
on: "insert.text",
|
|
84
|
-
guard: ({
|
|
85
|
-
snapshot,
|
|
86
|
-
event
|
|
87
|
-
}) => {
|
|
88
|
-
const hrCharacter = event.text === "-" ? "-" : event.text === "*" ? "*" : event.text === "_" ? "_" : void 0;
|
|
89
|
-
if (hrCharacter === void 0)
|
|
90
|
-
return !1;
|
|
91
|
-
const hrObject = config.horizontalRuleObject?.({
|
|
92
|
-
schema: snapshot.context.schema
|
|
93
|
-
}), focusBlock = selectors__namespace.getFocusTextBlock(snapshot), selectionCollapsed = selectors__namespace.isSelectionCollapsed(snapshot);
|
|
94
|
-
if (!hrObject || !focusBlock || !selectionCollapsed)
|
|
95
|
-
return !1;
|
|
96
|
-
const previousInlineObject = selectors__namespace.getPreviousInlineObject(snapshot), textBefore = selectors__namespace.getBlockTextBefore(snapshot), hrBlockOffsets = {
|
|
97
|
-
anchor: {
|
|
98
|
-
path: focusBlock.path,
|
|
99
|
-
offset: 0
|
|
100
|
-
},
|
|
101
|
-
focus: {
|
|
102
|
-
path: focusBlock.path,
|
|
103
|
-
offset: 3
|
|
104
|
-
}
|
|
105
|
-
};
|
|
106
|
-
return !previousInlineObject && textBefore === `${hrCharacter}${hrCharacter}` ? {
|
|
107
|
-
hrObject,
|
|
108
|
-
focusBlock,
|
|
109
|
-
hrCharacter,
|
|
110
|
-
hrBlockOffsets
|
|
111
|
-
} : !1;
|
|
112
|
-
},
|
|
113
|
-
actions: [(_, {
|
|
114
|
-
hrCharacter
|
|
115
|
-
}) => [behaviors.execute({
|
|
116
|
-
type: "insert.text",
|
|
117
|
-
text: hrCharacter
|
|
118
|
-
})], (_, {
|
|
119
|
-
hrObject,
|
|
120
|
-
hrBlockOffsets
|
|
121
|
-
}) => [behaviors.execute({
|
|
122
|
-
type: "insert.block",
|
|
123
|
-
block: {
|
|
124
|
-
_type: hrObject.name,
|
|
125
|
-
...hrObject.value ?? {}
|
|
126
|
-
},
|
|
127
|
-
placement: "before",
|
|
128
|
-
select: "none"
|
|
129
|
-
}), behaviors.execute({
|
|
130
|
-
type: "delete.text",
|
|
131
|
-
at: hrBlockOffsets
|
|
132
|
-
})]]
|
|
133
82
|
}), automaticHrOnPaste = behaviors.defineBehavior({
|
|
134
83
|
on: "clipboard.paste",
|
|
135
84
|
guard: ({
|
|
136
85
|
snapshot,
|
|
137
86
|
event
|
|
138
87
|
}) => {
|
|
139
|
-
const text = event.originEvent.dataTransfer.getData("text/plain"), hrRegExp = /^(---)
|
|
88
|
+
const text = event.originEvent.dataTransfer.getData("text/plain"), hrRegExp = /^(---)$|^(—-)$|^(___)$|^(\*\*\*)$/, hrCharacters = text.match(hrRegExp)?.[0], hrObject = config.horizontalRuleObject?.({
|
|
140
89
|
schema: snapshot.context.schema
|
|
141
90
|
}), focusBlock = selectors__namespace.getFocusBlock(snapshot), focusTextBlock = selectors__namespace.getFocusTextBlock(snapshot);
|
|
142
91
|
return !hrCharacters || !hrObject || !focusBlock ? !1 : {
|
|
@@ -349,10 +298,45 @@ function createMarkdownBehaviors(config) {
|
|
|
349
298
|
}
|
|
350
299
|
})]]
|
|
351
300
|
});
|
|
352
|
-
return [automaticBlockquoteOnSpace, automaticHeadingOnSpace,
|
|
301
|
+
return [automaticBlockquoteOnSpace, automaticHeadingOnSpace, automaticHrOnPaste, clearStyleOnBackspace, automaticListOnSpace];
|
|
302
|
+
}
|
|
303
|
+
function createHorizontalRuleRule(config) {
|
|
304
|
+
return pluginInputRule.defineInputRule({
|
|
305
|
+
on: /^(---)|^(—-)|^(___)|^(\*\*\*)/,
|
|
306
|
+
guard: ({
|
|
307
|
+
snapshot,
|
|
308
|
+
event
|
|
309
|
+
}) => {
|
|
310
|
+
const hrObject = config.horizontalRuleObject({
|
|
311
|
+
schema: snapshot.context.schema
|
|
312
|
+
});
|
|
313
|
+
if (!hrObject || selectors.getPreviousInlineObject(snapshot))
|
|
314
|
+
return !1;
|
|
315
|
+
const match = event.matches.at(0);
|
|
316
|
+
return match ? {
|
|
317
|
+
hrObject,
|
|
318
|
+
match
|
|
319
|
+
} : !1;
|
|
320
|
+
},
|
|
321
|
+
actions: [(_, {
|
|
322
|
+
hrObject,
|
|
323
|
+
match
|
|
324
|
+
}) => [behaviors.raise({
|
|
325
|
+
type: "insert.block",
|
|
326
|
+
block: {
|
|
327
|
+
_type: hrObject.name,
|
|
328
|
+
...hrObject.value ?? {}
|
|
329
|
+
},
|
|
330
|
+
placement: "before",
|
|
331
|
+
select: "none"
|
|
332
|
+
}), behaviors.raise({
|
|
333
|
+
type: "delete",
|
|
334
|
+
at: match.targetOffsets
|
|
335
|
+
})]]
|
|
336
|
+
});
|
|
353
337
|
}
|
|
354
338
|
function MarkdownShortcutsPlugin(t0) {
|
|
355
|
-
const $ = compilerRuntime.c(
|
|
339
|
+
const $ = compilerRuntime.c(25), {
|
|
356
340
|
blockquoteStyle,
|
|
357
341
|
boldDecorator,
|
|
358
342
|
codeDecorator,
|
|
@@ -414,12 +398,17 @@ function MarkdownShortcutsPlugin(t0) {
|
|
|
414
398
|
amount: 2
|
|
415
399
|
} }) : null, $[15] = strikeThroughDecorator, $[16] = t6) : t6 = $[16];
|
|
416
400
|
let t7;
|
|
417
|
-
|
|
401
|
+
$[17] !== horizontalRuleObject ? (t7 = horizontalRuleObject ? /* @__PURE__ */ jsxRuntime.jsx(pluginInputRule.InputRulePlugin, { rules: [createHorizontalRuleRule({
|
|
402
|
+
horizontalRuleObject
|
|
403
|
+
})] }) : null, $[17] = horizontalRuleObject, $[18] = t7) : t7 = $[18];
|
|
404
|
+
let t8;
|
|
405
|
+
return $[19] !== t3 || $[20] !== t4 || $[21] !== t5 || $[22] !== t6 || $[23] !== t7 ? (t8 = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
418
406
|
t3,
|
|
419
407
|
t4,
|
|
420
408
|
t5,
|
|
421
|
-
t6
|
|
422
|
-
|
|
409
|
+
t6,
|
|
410
|
+
t7
|
|
411
|
+
] }), $[19] = t3, $[20] = t4, $[21] = t5, $[22] = t6, $[23] = t7, $[24] = t8) : t8 = $[24], t8;
|
|
423
412
|
}
|
|
424
413
|
exports.MarkdownShortcutsPlugin = MarkdownShortcutsPlugin;
|
|
425
414
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/behavior.markdown-shortcuts.ts","../src/plugin.markdown-shortcuts.tsx"],"sourcesContent":["import type {EditorSchema} from '@portabletext/editor'\nimport {defineBehavior, execute} from '@portabletext/editor/behaviors'\nimport * as selectors from '@portabletext/editor/selectors'\nimport * as utils from '@portabletext/editor/utils'\n\nexport type MarkdownBehaviorsConfig = {\n horizontalRuleObject?: (context: {\n schema: EditorSchema\n }) => {name: string; value?: {[prop: string]: unknown}} | undefined\n defaultStyle?: (context: {schema: EditorSchema}) => string | undefined\n headingStyle?: (context: {\n schema: EditorSchema\n level: number\n }) => string | undefined\n blockquoteStyle?: (context: {schema: EditorSchema}) => string | undefined\n unorderedList?: (context: {schema: EditorSchema}) => string | undefined\n orderedList?: (context: {schema: EditorSchema}) => string | undefined\n}\n\nexport function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {\n const automaticBlockquoteOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const blockOffset = utils.spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (previousInlineObject || !blockOffset) {\n return false\n }\n\n const blockText = utils.getTextBlockText(focusTextBlock.node)\n const caretAtTheEndOfQuote = blockOffset.offset === 1\n const looksLikeMarkdownQuote = /^>/.test(blockText)\n const blockquoteStyle = config.blockquoteStyle?.({\n schema: snapshot.context.schema,\n })\n\n if (\n caretAtTheEndOfQuote &&\n looksLikeMarkdownQuote &&\n blockquoteStyle !== undefined\n ) {\n return {focusTextBlock, style: blockquoteStyle}\n }\n\n return false\n },\n actions: [\n () => [\n execute({\n type: 'insert.text',\n text: ' ',\n }),\n ],\n (_, {focusTextBlock, style}) => [\n execute({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n }),\n execute({\n type: 'block.set',\n props: {style},\n at: focusTextBlock.path,\n }),\n execute({\n type: 'delete.text',\n at: {\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: 2,\n },\n },\n }),\n ],\n ],\n })\n const automaticHr = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const hrCharacter =\n event.text === '-'\n ? '-'\n : event.text === '*'\n ? '*'\n : event.text === '_'\n ? '_'\n : undefined\n\n if (hrCharacter === undefined) {\n return false\n }\n\n const hrObject = config.horizontalRuleObject?.({\n schema: snapshot.context.schema,\n })\n const focusBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n\n if (!hrObject || !focusBlock || !selectionCollapsed) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const textBefore = selectors.getBlockTextBefore(snapshot)\n const hrBlockOffsets = {\n anchor: {\n path: focusBlock.path,\n offset: 0,\n },\n focus: {\n path: focusBlock.path,\n offset: 3,\n },\n }\n\n if (\n !previousInlineObject &&\n textBefore === `${hrCharacter}${hrCharacter}`\n ) {\n return {hrObject, focusBlock, hrCharacter, hrBlockOffsets}\n }\n\n return false\n },\n actions: [\n (_, {hrCharacter}) => [\n execute({\n type: 'insert.text',\n text: hrCharacter,\n }),\n ],\n (_, {hrObject, hrBlockOffsets}) => [\n execute({\n type: 'insert.block',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\n placement: 'before',\n select: 'none',\n }),\n execute({\n type: 'delete.text',\n at: hrBlockOffsets,\n }),\n ],\n ],\n })\n const automaticHrOnPaste = defineBehavior({\n on: 'clipboard.paste',\n guard: ({snapshot, event}) => {\n const text = event.originEvent.dataTransfer.getData('text/plain')\n const hrRegExp = /^(---)$|(___)$|(\\*\\*\\*)$/\n const hrCharacters = text.match(hrRegExp)?.[0]\n const hrObject = config.horizontalRuleObject?.({\n schema: snapshot.context.schema,\n })\n const focusBlock = selectors.getFocusBlock(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n\n if (!hrCharacters || !hrObject || !focusBlock) {\n return false\n }\n\n return {hrCharacters, hrObject, focusBlock, focusTextBlock}\n },\n actions: [\n (_, {hrCharacters}) => [\n execute({\n type: 'insert.text',\n text: hrCharacters,\n }),\n ],\n ({snapshot}, {hrObject, focusBlock, focusTextBlock}) =>\n focusTextBlock\n ? [\n execute({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n children: focusTextBlock.node.children,\n },\n placement: 'after',\n }),\n execute({\n type: 'insert.block',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\n placement: 'after',\n }),\n execute({\n type: 'delete.block',\n at: focusBlock.path,\n }),\n ]\n : [\n execute({\n type: 'insert.block',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\n placement: 'after',\n }),\n ],\n ],\n })\n const automaticHeadingOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = utils.spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!blockOffset) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const blockText = utils.getTextBlockText(focusTextBlock.node)\n const markdownHeadingSearch = /^#+/.exec(blockText)\n const level = markdownHeadingSearch\n ? markdownHeadingSearch[0].length\n : undefined\n const caretAtTheEndOfHeading = blockOffset.offset === level\n\n if (previousInlineObject || !caretAtTheEndOfHeading) {\n return false\n }\n\n const style =\n level !== undefined\n ? config.headingStyle?.({schema: snapshot.context.schema, level})\n : undefined\n\n if (level !== undefined && style !== undefined) {\n return {\n focusTextBlock,\n style: style,\n level,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [execute(event)],\n (_, {focusTextBlock, style, level}) => [\n execute({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n }),\n execute({\n type: 'block.set',\n props: {style},\n at: focusTextBlock.path,\n }),\n execute({\n type: 'delete.text',\n at: {\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: level + 1,\n },\n },\n }),\n ],\n ],\n })\n const clearStyleOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n snapshot.context.selection?.focus.offset === 0\n\n const defaultStyle = config.defaultStyle?.({\n schema: snapshot.context.schema,\n })\n\n if (\n atTheBeginningOfBLock &&\n defaultStyle &&\n focusTextBlock.node.style !== defaultStyle\n ) {\n return {defaultStyle, focusTextBlock}\n }\n\n return false\n },\n actions: [\n (_, {defaultStyle, focusTextBlock}) => [\n execute({\n type: 'block.set',\n props: {style: defaultStyle},\n at: focusTextBlock.path,\n }),\n ],\n ],\n })\n const automaticListOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const blockOffset = utils.spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (previousInlineObject || !blockOffset) {\n return false\n }\n\n const blockText = utils.getTextBlockText(focusTextBlock.node)\n const defaultStyle = config.defaultStyle?.({\n schema: snapshot.context.schema,\n })\n const looksLikeUnorderedList = /^(-|\\*)/.test(blockText)\n const unorderedList = config.unorderedList?.({\n schema: snapshot.context.schema,\n })\n const caretAtTheEndOfUnorderedList = blockOffset.offset === 1\n\n if (\n defaultStyle &&\n caretAtTheEndOfUnorderedList &&\n looksLikeUnorderedList &&\n unorderedList !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: unorderedList,\n listItemLength: 1,\n style: defaultStyle,\n }\n }\n\n const looksLikeOrderedList = /^1\\./.test(blockText)\n const orderedList = config.orderedList?.({\n schema: snapshot.context.schema,\n })\n const caretAtTheEndOfOrderedList = blockOffset.offset === 2\n\n if (\n defaultStyle &&\n caretAtTheEndOfOrderedList &&\n looksLikeOrderedList &&\n orderedList !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: orderedList,\n listItemLength: 2,\n style: defaultStyle,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [execute(event)],\n (_, {focusTextBlock, style, listItem, listItemLength}) => [\n execute({\n type: 'block.set',\n props: {\n listItem,\n level: 1,\n style,\n },\n at: focusTextBlock.path,\n }),\n execute({\n type: 'delete.text',\n at: {\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: listItemLength + 1,\n },\n },\n }),\n ],\n ],\n })\n\n const markdownBehaviors = [\n automaticBlockquoteOnSpace,\n automaticHeadingOnSpace,\n automaticHr,\n automaticHrOnPaste,\n clearStyleOnBackspace,\n automaticListOnSpace,\n ]\n\n return markdownBehaviors\n}\n","import {useEditor} from '@portabletext/editor'\nimport type {EditorSchema} from '@portabletext/editor'\nimport {CharacterPairDecoratorPlugin} from '@portabletext/plugin-character-pair-decorator'\nimport {useEffect} from 'react'\nimport {\n createMarkdownBehaviors,\n type MarkdownBehaviorsConfig,\n} from './behavior.markdown-shortcuts'\n\n/**\n * @beta\n */\nexport type MarkdownShortcutsPluginProps = MarkdownBehaviorsConfig & {\n boldDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n codeDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n italicDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n strikeThroughDecorator?: ({\n schema,\n }: {\n schema: EditorSchema\n }) => string | undefined\n}\n\n/**\n * @beta\n */\nexport function MarkdownShortcutsPlugin({\n blockquoteStyle,\n boldDecorator,\n codeDecorator,\n defaultStyle,\n headingStyle,\n horizontalRuleObject,\n italicDecorator,\n orderedList,\n strikeThroughDecorator,\n unorderedList,\n}: MarkdownShortcutsPluginProps) {\n const editor = useEditor()\n\n useEffect(() => {\n const behaviors = createMarkdownBehaviors({\n blockquoteStyle,\n defaultStyle,\n headingStyle,\n horizontalRuleObject,\n orderedList,\n unorderedList,\n })\n\n const unregisterBehaviors = behaviors.map((behavior) =>\n editor.registerBehavior({behavior}),\n )\n\n return () => {\n for (const unregisterBehavior of unregisterBehaviors) {\n unregisterBehavior()\n }\n }\n }, [\n blockquoteStyle,\n defaultStyle,\n editor,\n headingStyle,\n horizontalRuleObject,\n orderedList,\n unorderedList,\n ])\n\n return (\n <>\n {boldDecorator ? (\n <>\n <CharacterPairDecoratorPlugin\n decorator={boldDecorator}\n pair={{char: '*', amount: 2}}\n />\n <CharacterPairDecoratorPlugin\n decorator={boldDecorator}\n pair={{char: '_', amount: 2}}\n />\n </>\n ) : null}\n {codeDecorator ? (\n <CharacterPairDecoratorPlugin\n decorator={codeDecorator}\n pair={{char: '`', amount: 1}}\n />\n ) : null}\n {italicDecorator ? (\n <>\n <CharacterPairDecoratorPlugin\n decorator={italicDecorator}\n pair={{char: '*', amount: 1}}\n />\n <CharacterPairDecoratorPlugin\n decorator={italicDecorator}\n pair={{char: '_', amount: 1}}\n />\n </>\n ) : null}\n {strikeThroughDecorator ? (\n <CharacterPairDecoratorPlugin\n decorator={strikeThroughDecorator}\n pair={{char: '~', amount: 2}}\n />\n ) : null}\n </>\n )\n}\n"],"names":["createMarkdownBehaviors","config","automaticBlockquoteOnSpace","defineBehavior","on","guard","snapshot","event","text","selectionCollapsed","selectors","isSelectionCollapsed","focusTextBlock","getFocusTextBlock","focusSpan","getFocusSpan","previousInlineObject","getPreviousInlineObject","blockOffset","utils","spanSelectionPointToBlockOffset","context","selectionPoint","path","_key","node","offset","selection","focus","blockText","getTextBlockText","caretAtTheEndOfQuote","looksLikeMarkdownQuote","test","blockquoteStyle","schema","undefined","style","actions","execute","type","_","props","at","anchor","automaticHr","hrCharacter","hrObject","horizontalRuleObject","focusBlock","textBefore","getBlockTextBefore","hrBlockOffsets","block","_type","name","value","placement","select","automaticHrOnPaste","originEvent","dataTransfer","getData","hrRegExp","hrCharacters","match","getFocusBlock","children","automaticHeadingOnSpace","markdownHeadingSearch","exec","level","length","caretAtTheEndOfHeading","headingStyle","clearStyleOnBackspace","atTheBeginningOfBLock","defaultStyle","automaticListOnSpace","looksLikeUnorderedList","unorderedList","caretAtTheEndOfUnorderedList","listItem","listItemLength","looksLikeOrderedList","orderedList","caretAtTheEndOfOrderedList","MarkdownShortcutsPlugin","t0","$","_c","boldDecorator","codeDecorator","italicDecorator","strikeThroughDecorator","editor","useEditor","t1","t2","unregisterBehaviors","map","behavior","registerBehavior","unregisterBehavior","useEffect","t3","jsxs","Fragment","jsx","CharacterPairDecoratorPlugin","char","amount","t4","t5","t6","t7"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/behavior.markdown-shortcuts.ts","../src/rule.horizontal-rule.ts","../src/plugin.markdown-shortcuts.tsx"],"sourcesContent":["import type {EditorSchema} from '@portabletext/editor'\nimport {defineBehavior, execute} from '@portabletext/editor/behaviors'\nimport * as selectors from '@portabletext/editor/selectors'\nimport * as utils from '@portabletext/editor/utils'\n\nexport type MarkdownBehaviorsConfig = {\n horizontalRuleObject?: (context: {\n schema: EditorSchema\n }) => {name: string; value?: {[prop: string]: unknown}} | undefined\n defaultStyle?: (context: {schema: EditorSchema}) => string | undefined\n headingStyle?: (context: {\n schema: EditorSchema\n level: number\n }) => string | undefined\n blockquoteStyle?: (context: {schema: EditorSchema}) => string | undefined\n unorderedList?: (context: {schema: EditorSchema}) => string | undefined\n orderedList?: (context: {schema: EditorSchema}) => string | undefined\n}\n\nexport function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {\n const automaticBlockquoteOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const blockOffset = utils.spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (previousInlineObject || !blockOffset) {\n return false\n }\n\n const blockText = utils.getTextBlockText(focusTextBlock.node)\n const caretAtTheEndOfQuote = blockOffset.offset === 1\n const looksLikeMarkdownQuote = /^>/.test(blockText)\n const blockquoteStyle = config.blockquoteStyle?.({\n schema: snapshot.context.schema,\n })\n\n if (\n caretAtTheEndOfQuote &&\n looksLikeMarkdownQuote &&\n blockquoteStyle !== undefined\n ) {\n return {focusTextBlock, style: blockquoteStyle}\n }\n\n return false\n },\n actions: [\n () => [\n execute({\n type: 'insert.text',\n text: ' ',\n }),\n ],\n (_, {focusTextBlock, style}) => [\n execute({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n }),\n execute({\n type: 'block.set',\n props: {style},\n at: focusTextBlock.path,\n }),\n execute({\n type: 'delete.text',\n at: {\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: 2,\n },\n },\n }),\n ],\n ],\n })\n const automaticHrOnPaste = defineBehavior({\n on: 'clipboard.paste',\n guard: ({snapshot, event}) => {\n const text = event.originEvent.dataTransfer.getData('text/plain')\n const hrRegExp = /^(---)$|^(—-)$|^(___)$|^(\\*\\*\\*)$/\n const hrCharacters = text.match(hrRegExp)?.[0]\n const hrObject = config.horizontalRuleObject?.({\n schema: snapshot.context.schema,\n })\n const focusBlock = selectors.getFocusBlock(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n\n if (!hrCharacters || !hrObject || !focusBlock) {\n return false\n }\n\n return {hrCharacters, hrObject, focusBlock, focusTextBlock}\n },\n actions: [\n (_, {hrCharacters}) => [\n execute({\n type: 'insert.text',\n text: hrCharacters,\n }),\n ],\n ({snapshot}, {hrObject, focusBlock, focusTextBlock}) =>\n focusTextBlock\n ? [\n execute({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n children: focusTextBlock.node.children,\n },\n placement: 'after',\n }),\n execute({\n type: 'insert.block',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\n placement: 'after',\n }),\n execute({\n type: 'delete.block',\n at: focusBlock.path,\n }),\n ]\n : [\n execute({\n type: 'insert.block',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\n placement: 'after',\n }),\n ],\n ],\n })\n const automaticHeadingOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = utils.spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!blockOffset) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const blockText = utils.getTextBlockText(focusTextBlock.node)\n const markdownHeadingSearch = /^#+/.exec(blockText)\n const level = markdownHeadingSearch\n ? markdownHeadingSearch[0].length\n : undefined\n const caretAtTheEndOfHeading = blockOffset.offset === level\n\n if (previousInlineObject || !caretAtTheEndOfHeading) {\n return false\n }\n\n const style =\n level !== undefined\n ? config.headingStyle?.({schema: snapshot.context.schema, level})\n : undefined\n\n if (level !== undefined && style !== undefined) {\n return {\n focusTextBlock,\n style: style,\n level,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [execute(event)],\n (_, {focusTextBlock, style, level}) => [\n execute({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n }),\n execute({\n type: 'block.set',\n props: {style},\n at: focusTextBlock.path,\n }),\n execute({\n type: 'delete.text',\n at: {\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: level + 1,\n },\n },\n }),\n ],\n ],\n })\n const clearStyleOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n snapshot.context.selection?.focus.offset === 0\n\n const defaultStyle = config.defaultStyle?.({\n schema: snapshot.context.schema,\n })\n\n if (\n atTheBeginningOfBLock &&\n defaultStyle &&\n focusTextBlock.node.style !== defaultStyle\n ) {\n return {defaultStyle, focusTextBlock}\n }\n\n return false\n },\n actions: [\n (_, {defaultStyle, focusTextBlock}) => [\n execute({\n type: 'block.set',\n props: {style: defaultStyle},\n at: focusTextBlock.path,\n }),\n ],\n ],\n })\n const automaticListOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const blockOffset = utils.spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (previousInlineObject || !blockOffset) {\n return false\n }\n\n const blockText = utils.getTextBlockText(focusTextBlock.node)\n const defaultStyle = config.defaultStyle?.({\n schema: snapshot.context.schema,\n })\n const looksLikeUnorderedList = /^(-|\\*)/.test(blockText)\n const unorderedList = config.unorderedList?.({\n schema: snapshot.context.schema,\n })\n const caretAtTheEndOfUnorderedList = blockOffset.offset === 1\n\n if (\n defaultStyle &&\n caretAtTheEndOfUnorderedList &&\n looksLikeUnorderedList &&\n unorderedList !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: unorderedList,\n listItemLength: 1,\n style: defaultStyle,\n }\n }\n\n const looksLikeOrderedList = /^1\\./.test(blockText)\n const orderedList = config.orderedList?.({\n schema: snapshot.context.schema,\n })\n const caretAtTheEndOfOrderedList = blockOffset.offset === 2\n\n if (\n defaultStyle &&\n caretAtTheEndOfOrderedList &&\n looksLikeOrderedList &&\n orderedList !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: orderedList,\n listItemLength: 2,\n style: defaultStyle,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [execute(event)],\n (_, {focusTextBlock, style, listItem, listItemLength}) => [\n execute({\n type: 'block.set',\n props: {\n listItem,\n level: 1,\n style,\n },\n at: focusTextBlock.path,\n }),\n execute({\n type: 'delete.text',\n at: {\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: listItemLength + 1,\n },\n },\n }),\n ],\n ],\n })\n\n const markdownBehaviors = [\n automaticBlockquoteOnSpace,\n automaticHeadingOnSpace,\n automaticHrOnPaste,\n clearStyleOnBackspace,\n automaticListOnSpace,\n ]\n\n return markdownBehaviors\n}\n","import type {EditorSchema} from '@portabletext/editor'\nimport {raise} from '@portabletext/editor/behaviors'\nimport {getPreviousInlineObject} from '@portabletext/editor/selectors'\nimport {defineInputRule} from '@portabletext/plugin-input-rule'\n\nexport function createHorizontalRuleRule(config: {\n horizontalRuleObject: (context: {\n schema: EditorSchema\n }) => {name: string; value?: {[prop: string]: unknown}} | undefined\n}) {\n return defineInputRule({\n on: /^(---)|^(—-)|^(___)|^(\\*\\*\\*)/,\n guard: ({snapshot, event}) => {\n const hrObject = config.horizontalRuleObject({\n schema: snapshot.context.schema,\n })\n\n if (!hrObject) {\n // If no horizontal rule object is provided, then we can safely skip\n // this rule.\n return false\n }\n\n const previousInlineObject = getPreviousInlineObject(snapshot)\n\n if (previousInlineObject) {\n // Input Rules only look at the plain text of the text block. This\n // means that the RegExp is matched even if there is a leading inline\n // object.\n return false\n }\n\n // In theory, an Input Rule could return multiple matches. But in this\n // case we only expect one match.\n const match = event.matches.at(0)\n\n if (!match) {\n return false\n }\n\n return {hrObject, match}\n },\n actions: [\n (_, {hrObject, match}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\n placement: 'before',\n select: 'none',\n }),\n raise({\n type: 'delete',\n at: match.targetOffsets,\n }),\n ],\n ],\n })\n}\n","import {useEditor} from '@portabletext/editor'\nimport type {EditorSchema} from '@portabletext/editor'\nimport {CharacterPairDecoratorPlugin} from '@portabletext/plugin-character-pair-decorator'\nimport {InputRulePlugin} from '@portabletext/plugin-input-rule'\nimport {useEffect} from 'react'\nimport {\n createMarkdownBehaviors,\n type MarkdownBehaviorsConfig,\n} from './behavior.markdown-shortcuts'\nimport {createHorizontalRuleRule} from './rule.horizontal-rule'\n\n/**\n * @beta\n */\nexport type MarkdownShortcutsPluginProps = MarkdownBehaviorsConfig & {\n boldDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n codeDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n italicDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n strikeThroughDecorator?: ({\n schema,\n }: {\n schema: EditorSchema\n }) => string | undefined\n}\n\n/**\n * @beta\n */\nexport function MarkdownShortcutsPlugin({\n blockquoteStyle,\n boldDecorator,\n codeDecorator,\n defaultStyle,\n headingStyle,\n horizontalRuleObject,\n italicDecorator,\n orderedList,\n strikeThroughDecorator,\n unorderedList,\n}: MarkdownShortcutsPluginProps) {\n const editor = useEditor()\n\n useEffect(() => {\n const behaviors = createMarkdownBehaviors({\n blockquoteStyle,\n defaultStyle,\n headingStyle,\n horizontalRuleObject,\n orderedList,\n unorderedList,\n })\n\n const unregisterBehaviors = behaviors.map((behavior) =>\n editor.registerBehavior({behavior}),\n )\n\n return () => {\n for (const unregisterBehavior of unregisterBehaviors) {\n unregisterBehavior()\n }\n }\n }, [\n blockquoteStyle,\n defaultStyle,\n editor,\n headingStyle,\n horizontalRuleObject,\n orderedList,\n unorderedList,\n ])\n\n return (\n <>\n {boldDecorator ? (\n <>\n <CharacterPairDecoratorPlugin\n decorator={boldDecorator}\n pair={{char: '*', amount: 2}}\n />\n <CharacterPairDecoratorPlugin\n decorator={boldDecorator}\n pair={{char: '_', amount: 2}}\n />\n </>\n ) : null}\n {codeDecorator ? (\n <CharacterPairDecoratorPlugin\n decorator={codeDecorator}\n pair={{char: '`', amount: 1}}\n />\n ) : null}\n {italicDecorator ? (\n <>\n <CharacterPairDecoratorPlugin\n decorator={italicDecorator}\n pair={{char: '*', amount: 1}}\n />\n <CharacterPairDecoratorPlugin\n decorator={italicDecorator}\n pair={{char: '_', amount: 1}}\n />\n </>\n ) : null}\n {strikeThroughDecorator ? (\n <CharacterPairDecoratorPlugin\n decorator={strikeThroughDecorator}\n pair={{char: '~', amount: 2}}\n />\n ) : null}\n {horizontalRuleObject ? (\n <InputRulePlugin\n rules={[createHorizontalRuleRule({horizontalRuleObject})]}\n />\n ) : null}\n </>\n )\n}\n"],"names":["createMarkdownBehaviors","config","automaticBlockquoteOnSpace","defineBehavior","on","guard","snapshot","event","text","selectionCollapsed","selectors","isSelectionCollapsed","focusTextBlock","getFocusTextBlock","focusSpan","getFocusSpan","previousInlineObject","getPreviousInlineObject","blockOffset","utils","spanSelectionPointToBlockOffset","context","selectionPoint","path","_key","node","offset","selection","focus","blockText","getTextBlockText","caretAtTheEndOfQuote","looksLikeMarkdownQuote","test","blockquoteStyle","schema","undefined","style","actions","execute","type","_","props","at","anchor","automaticHrOnPaste","originEvent","dataTransfer","getData","hrRegExp","hrCharacters","match","hrObject","horizontalRuleObject","focusBlock","getFocusBlock","block","_type","name","children","placement","value","automaticHeadingOnSpace","markdownHeadingSearch","exec","level","length","caretAtTheEndOfHeading","headingStyle","clearStyleOnBackspace","atTheBeginningOfBLock","defaultStyle","automaticListOnSpace","looksLikeUnorderedList","unorderedList","caretAtTheEndOfUnorderedList","listItem","listItemLength","looksLikeOrderedList","orderedList","caretAtTheEndOfOrderedList","createHorizontalRuleRule","defineInputRule","matches","raise","select","targetOffsets","MarkdownShortcutsPlugin","t0","$","_c","boldDecorator","codeDecorator","italicDecorator","strikeThroughDecorator","editor","useEditor","t1","t2","unregisterBehaviors","map","behavior","registerBehavior","unregisterBehavior","useEffect","t3","jsxs","Fragment","jsx","CharacterPairDecoratorPlugin","char","amount","t4","t5","t6","t7","InputRulePlugin","t8"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { jsxs, Fragment
|
|
1
|
+
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { c } from "react/compiler-runtime";
|
|
3
3
|
import { useEditor } from "@portabletext/editor";
|
|
4
4
|
import { CharacterPairDecoratorPlugin } from "@portabletext/plugin-character-pair-decorator";
|
|
5
|
+
import { defineInputRule, InputRulePlugin } from "@portabletext/plugin-input-rule";
|
|
5
6
|
import { useEffect } from "react";
|
|
6
|
-
import { defineBehavior, execute } from "@portabletext/editor/behaviors";
|
|
7
|
+
import { defineBehavior, execute, raise } from "@portabletext/editor/behaviors";
|
|
7
8
|
import * as selectors from "@portabletext/editor/selectors";
|
|
9
|
+
import { getPreviousInlineObject } from "@portabletext/editor/selectors";
|
|
8
10
|
import * as utils from "@portabletext/editor/utils";
|
|
9
11
|
function createMarkdownBehaviors(config) {
|
|
10
12
|
const automaticBlockquoteOnSpace = defineBehavior({
|
|
@@ -68,64 +70,13 @@ function createMarkdownBehaviors(config) {
|
|
|
68
70
|
}
|
|
69
71
|
}
|
|
70
72
|
})]]
|
|
71
|
-
}), automaticHr = defineBehavior({
|
|
72
|
-
on: "insert.text",
|
|
73
|
-
guard: ({
|
|
74
|
-
snapshot,
|
|
75
|
-
event
|
|
76
|
-
}) => {
|
|
77
|
-
const hrCharacter = event.text === "-" ? "-" : event.text === "*" ? "*" : event.text === "_" ? "_" : void 0;
|
|
78
|
-
if (hrCharacter === void 0)
|
|
79
|
-
return !1;
|
|
80
|
-
const hrObject = config.horizontalRuleObject?.({
|
|
81
|
-
schema: snapshot.context.schema
|
|
82
|
-
}), focusBlock = selectors.getFocusTextBlock(snapshot), selectionCollapsed = selectors.isSelectionCollapsed(snapshot);
|
|
83
|
-
if (!hrObject || !focusBlock || !selectionCollapsed)
|
|
84
|
-
return !1;
|
|
85
|
-
const previousInlineObject = selectors.getPreviousInlineObject(snapshot), textBefore = selectors.getBlockTextBefore(snapshot), hrBlockOffsets = {
|
|
86
|
-
anchor: {
|
|
87
|
-
path: focusBlock.path,
|
|
88
|
-
offset: 0
|
|
89
|
-
},
|
|
90
|
-
focus: {
|
|
91
|
-
path: focusBlock.path,
|
|
92
|
-
offset: 3
|
|
93
|
-
}
|
|
94
|
-
};
|
|
95
|
-
return !previousInlineObject && textBefore === `${hrCharacter}${hrCharacter}` ? {
|
|
96
|
-
hrObject,
|
|
97
|
-
focusBlock,
|
|
98
|
-
hrCharacter,
|
|
99
|
-
hrBlockOffsets
|
|
100
|
-
} : !1;
|
|
101
|
-
},
|
|
102
|
-
actions: [(_, {
|
|
103
|
-
hrCharacter
|
|
104
|
-
}) => [execute({
|
|
105
|
-
type: "insert.text",
|
|
106
|
-
text: hrCharacter
|
|
107
|
-
})], (_, {
|
|
108
|
-
hrObject,
|
|
109
|
-
hrBlockOffsets
|
|
110
|
-
}) => [execute({
|
|
111
|
-
type: "insert.block",
|
|
112
|
-
block: {
|
|
113
|
-
_type: hrObject.name,
|
|
114
|
-
...hrObject.value ?? {}
|
|
115
|
-
},
|
|
116
|
-
placement: "before",
|
|
117
|
-
select: "none"
|
|
118
|
-
}), execute({
|
|
119
|
-
type: "delete.text",
|
|
120
|
-
at: hrBlockOffsets
|
|
121
|
-
})]]
|
|
122
73
|
}), automaticHrOnPaste = defineBehavior({
|
|
123
74
|
on: "clipboard.paste",
|
|
124
75
|
guard: ({
|
|
125
76
|
snapshot,
|
|
126
77
|
event
|
|
127
78
|
}) => {
|
|
128
|
-
const text = event.originEvent.dataTransfer.getData("text/plain"), hrRegExp = /^(---)
|
|
79
|
+
const text = event.originEvent.dataTransfer.getData("text/plain"), hrRegExp = /^(---)$|^(—-)$|^(___)$|^(\*\*\*)$/, hrCharacters = text.match(hrRegExp)?.[0], hrObject = config.horizontalRuleObject?.({
|
|
129
80
|
schema: snapshot.context.schema
|
|
130
81
|
}), focusBlock = selectors.getFocusBlock(snapshot), focusTextBlock = selectors.getFocusTextBlock(snapshot);
|
|
131
82
|
return !hrCharacters || !hrObject || !focusBlock ? !1 : {
|
|
@@ -338,10 +289,45 @@ function createMarkdownBehaviors(config) {
|
|
|
338
289
|
}
|
|
339
290
|
})]]
|
|
340
291
|
});
|
|
341
|
-
return [automaticBlockquoteOnSpace, automaticHeadingOnSpace,
|
|
292
|
+
return [automaticBlockquoteOnSpace, automaticHeadingOnSpace, automaticHrOnPaste, clearStyleOnBackspace, automaticListOnSpace];
|
|
293
|
+
}
|
|
294
|
+
function createHorizontalRuleRule(config) {
|
|
295
|
+
return defineInputRule({
|
|
296
|
+
on: /^(---)|^(—-)|^(___)|^(\*\*\*)/,
|
|
297
|
+
guard: ({
|
|
298
|
+
snapshot,
|
|
299
|
+
event
|
|
300
|
+
}) => {
|
|
301
|
+
const hrObject = config.horizontalRuleObject({
|
|
302
|
+
schema: snapshot.context.schema
|
|
303
|
+
});
|
|
304
|
+
if (!hrObject || getPreviousInlineObject(snapshot))
|
|
305
|
+
return !1;
|
|
306
|
+
const match = event.matches.at(0);
|
|
307
|
+
return match ? {
|
|
308
|
+
hrObject,
|
|
309
|
+
match
|
|
310
|
+
} : !1;
|
|
311
|
+
},
|
|
312
|
+
actions: [(_, {
|
|
313
|
+
hrObject,
|
|
314
|
+
match
|
|
315
|
+
}) => [raise({
|
|
316
|
+
type: "insert.block",
|
|
317
|
+
block: {
|
|
318
|
+
_type: hrObject.name,
|
|
319
|
+
...hrObject.value ?? {}
|
|
320
|
+
},
|
|
321
|
+
placement: "before",
|
|
322
|
+
select: "none"
|
|
323
|
+
}), raise({
|
|
324
|
+
type: "delete",
|
|
325
|
+
at: match.targetOffsets
|
|
326
|
+
})]]
|
|
327
|
+
});
|
|
342
328
|
}
|
|
343
329
|
function MarkdownShortcutsPlugin(t0) {
|
|
344
|
-
const $ = c(
|
|
330
|
+
const $ = c(25), {
|
|
345
331
|
blockquoteStyle,
|
|
346
332
|
boldDecorator,
|
|
347
333
|
codeDecorator,
|
|
@@ -403,12 +389,17 @@ function MarkdownShortcutsPlugin(t0) {
|
|
|
403
389
|
amount: 2
|
|
404
390
|
} }) : null, $[15] = strikeThroughDecorator, $[16] = t6) : t6 = $[16];
|
|
405
391
|
let t7;
|
|
406
|
-
|
|
392
|
+
$[17] !== horizontalRuleObject ? (t7 = horizontalRuleObject ? /* @__PURE__ */ jsx(InputRulePlugin, { rules: [createHorizontalRuleRule({
|
|
393
|
+
horizontalRuleObject
|
|
394
|
+
})] }) : null, $[17] = horizontalRuleObject, $[18] = t7) : t7 = $[18];
|
|
395
|
+
let t8;
|
|
396
|
+
return $[19] !== t3 || $[20] !== t4 || $[21] !== t5 || $[22] !== t6 || $[23] !== t7 ? (t8 = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
407
397
|
t3,
|
|
408
398
|
t4,
|
|
409
399
|
t5,
|
|
410
|
-
t6
|
|
411
|
-
|
|
400
|
+
t6,
|
|
401
|
+
t7
|
|
402
|
+
] }), $[19] = t3, $[20] = t4, $[21] = t5, $[22] = t6, $[23] = t7, $[24] = t8) : t8 = $[24], t8;
|
|
412
403
|
}
|
|
413
404
|
export {
|
|
414
405
|
MarkdownShortcutsPlugin
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/behavior.markdown-shortcuts.ts","../src/plugin.markdown-shortcuts.tsx"],"sourcesContent":["import type {EditorSchema} from '@portabletext/editor'\nimport {defineBehavior, execute} from '@portabletext/editor/behaviors'\nimport * as selectors from '@portabletext/editor/selectors'\nimport * as utils from '@portabletext/editor/utils'\n\nexport type MarkdownBehaviorsConfig = {\n horizontalRuleObject?: (context: {\n schema: EditorSchema\n }) => {name: string; value?: {[prop: string]: unknown}} | undefined\n defaultStyle?: (context: {schema: EditorSchema}) => string | undefined\n headingStyle?: (context: {\n schema: EditorSchema\n level: number\n }) => string | undefined\n blockquoteStyle?: (context: {schema: EditorSchema}) => string | undefined\n unorderedList?: (context: {schema: EditorSchema}) => string | undefined\n orderedList?: (context: {schema: EditorSchema}) => string | undefined\n}\n\nexport function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {\n const automaticBlockquoteOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const blockOffset = utils.spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (previousInlineObject || !blockOffset) {\n return false\n }\n\n const blockText = utils.getTextBlockText(focusTextBlock.node)\n const caretAtTheEndOfQuote = blockOffset.offset === 1\n const looksLikeMarkdownQuote = /^>/.test(blockText)\n const blockquoteStyle = config.blockquoteStyle?.({\n schema: snapshot.context.schema,\n })\n\n if (\n caretAtTheEndOfQuote &&\n looksLikeMarkdownQuote &&\n blockquoteStyle !== undefined\n ) {\n return {focusTextBlock, style: blockquoteStyle}\n }\n\n return false\n },\n actions: [\n () => [\n execute({\n type: 'insert.text',\n text: ' ',\n }),\n ],\n (_, {focusTextBlock, style}) => [\n execute({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n }),\n execute({\n type: 'block.set',\n props: {style},\n at: focusTextBlock.path,\n }),\n execute({\n type: 'delete.text',\n at: {\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: 2,\n },\n },\n }),\n ],\n ],\n })\n const automaticHr = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const hrCharacter =\n event.text === '-'\n ? '-'\n : event.text === '*'\n ? '*'\n : event.text === '_'\n ? '_'\n : undefined\n\n if (hrCharacter === undefined) {\n return false\n }\n\n const hrObject = config.horizontalRuleObject?.({\n schema: snapshot.context.schema,\n })\n const focusBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n\n if (!hrObject || !focusBlock || !selectionCollapsed) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const textBefore = selectors.getBlockTextBefore(snapshot)\n const hrBlockOffsets = {\n anchor: {\n path: focusBlock.path,\n offset: 0,\n },\n focus: {\n path: focusBlock.path,\n offset: 3,\n },\n }\n\n if (\n !previousInlineObject &&\n textBefore === `${hrCharacter}${hrCharacter}`\n ) {\n return {hrObject, focusBlock, hrCharacter, hrBlockOffsets}\n }\n\n return false\n },\n actions: [\n (_, {hrCharacter}) => [\n execute({\n type: 'insert.text',\n text: hrCharacter,\n }),\n ],\n (_, {hrObject, hrBlockOffsets}) => [\n execute({\n type: 'insert.block',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\n placement: 'before',\n select: 'none',\n }),\n execute({\n type: 'delete.text',\n at: hrBlockOffsets,\n }),\n ],\n ],\n })\n const automaticHrOnPaste = defineBehavior({\n on: 'clipboard.paste',\n guard: ({snapshot, event}) => {\n const text = event.originEvent.dataTransfer.getData('text/plain')\n const hrRegExp = /^(---)$|(___)$|(\\*\\*\\*)$/\n const hrCharacters = text.match(hrRegExp)?.[0]\n const hrObject = config.horizontalRuleObject?.({\n schema: snapshot.context.schema,\n })\n const focusBlock = selectors.getFocusBlock(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n\n if (!hrCharacters || !hrObject || !focusBlock) {\n return false\n }\n\n return {hrCharacters, hrObject, focusBlock, focusTextBlock}\n },\n actions: [\n (_, {hrCharacters}) => [\n execute({\n type: 'insert.text',\n text: hrCharacters,\n }),\n ],\n ({snapshot}, {hrObject, focusBlock, focusTextBlock}) =>\n focusTextBlock\n ? [\n execute({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n children: focusTextBlock.node.children,\n },\n placement: 'after',\n }),\n execute({\n type: 'insert.block',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\n placement: 'after',\n }),\n execute({\n type: 'delete.block',\n at: focusBlock.path,\n }),\n ]\n : [\n execute({\n type: 'insert.block',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\n placement: 'after',\n }),\n ],\n ],\n })\n const automaticHeadingOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = utils.spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!blockOffset) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const blockText = utils.getTextBlockText(focusTextBlock.node)\n const markdownHeadingSearch = /^#+/.exec(blockText)\n const level = markdownHeadingSearch\n ? markdownHeadingSearch[0].length\n : undefined\n const caretAtTheEndOfHeading = blockOffset.offset === level\n\n if (previousInlineObject || !caretAtTheEndOfHeading) {\n return false\n }\n\n const style =\n level !== undefined\n ? config.headingStyle?.({schema: snapshot.context.schema, level})\n : undefined\n\n if (level !== undefined && style !== undefined) {\n return {\n focusTextBlock,\n style: style,\n level,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [execute(event)],\n (_, {focusTextBlock, style, level}) => [\n execute({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n }),\n execute({\n type: 'block.set',\n props: {style},\n at: focusTextBlock.path,\n }),\n execute({\n type: 'delete.text',\n at: {\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: level + 1,\n },\n },\n }),\n ],\n ],\n })\n const clearStyleOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n snapshot.context.selection?.focus.offset === 0\n\n const defaultStyle = config.defaultStyle?.({\n schema: snapshot.context.schema,\n })\n\n if (\n atTheBeginningOfBLock &&\n defaultStyle &&\n focusTextBlock.node.style !== defaultStyle\n ) {\n return {defaultStyle, focusTextBlock}\n }\n\n return false\n },\n actions: [\n (_, {defaultStyle, focusTextBlock}) => [\n execute({\n type: 'block.set',\n props: {style: defaultStyle},\n at: focusTextBlock.path,\n }),\n ],\n ],\n })\n const automaticListOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const blockOffset = utils.spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (previousInlineObject || !blockOffset) {\n return false\n }\n\n const blockText = utils.getTextBlockText(focusTextBlock.node)\n const defaultStyle = config.defaultStyle?.({\n schema: snapshot.context.schema,\n })\n const looksLikeUnorderedList = /^(-|\\*)/.test(blockText)\n const unorderedList = config.unorderedList?.({\n schema: snapshot.context.schema,\n })\n const caretAtTheEndOfUnorderedList = blockOffset.offset === 1\n\n if (\n defaultStyle &&\n caretAtTheEndOfUnorderedList &&\n looksLikeUnorderedList &&\n unorderedList !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: unorderedList,\n listItemLength: 1,\n style: defaultStyle,\n }\n }\n\n const looksLikeOrderedList = /^1\\./.test(blockText)\n const orderedList = config.orderedList?.({\n schema: snapshot.context.schema,\n })\n const caretAtTheEndOfOrderedList = blockOffset.offset === 2\n\n if (\n defaultStyle &&\n caretAtTheEndOfOrderedList &&\n looksLikeOrderedList &&\n orderedList !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: orderedList,\n listItemLength: 2,\n style: defaultStyle,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [execute(event)],\n (_, {focusTextBlock, style, listItem, listItemLength}) => [\n execute({\n type: 'block.set',\n props: {\n listItem,\n level: 1,\n style,\n },\n at: focusTextBlock.path,\n }),\n execute({\n type: 'delete.text',\n at: {\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: listItemLength + 1,\n },\n },\n }),\n ],\n ],\n })\n\n const markdownBehaviors = [\n automaticBlockquoteOnSpace,\n automaticHeadingOnSpace,\n automaticHr,\n automaticHrOnPaste,\n clearStyleOnBackspace,\n automaticListOnSpace,\n ]\n\n return markdownBehaviors\n}\n","import {useEditor} from '@portabletext/editor'\nimport type {EditorSchema} from '@portabletext/editor'\nimport {CharacterPairDecoratorPlugin} from '@portabletext/plugin-character-pair-decorator'\nimport {useEffect} from 'react'\nimport {\n createMarkdownBehaviors,\n type MarkdownBehaviorsConfig,\n} from './behavior.markdown-shortcuts'\n\n/**\n * @beta\n */\nexport type MarkdownShortcutsPluginProps = MarkdownBehaviorsConfig & {\n boldDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n codeDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n italicDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n strikeThroughDecorator?: ({\n schema,\n }: {\n schema: EditorSchema\n }) => string | undefined\n}\n\n/**\n * @beta\n */\nexport function MarkdownShortcutsPlugin({\n blockquoteStyle,\n boldDecorator,\n codeDecorator,\n defaultStyle,\n headingStyle,\n horizontalRuleObject,\n italicDecorator,\n orderedList,\n strikeThroughDecorator,\n unorderedList,\n}: MarkdownShortcutsPluginProps) {\n const editor = useEditor()\n\n useEffect(() => {\n const behaviors = createMarkdownBehaviors({\n blockquoteStyle,\n defaultStyle,\n headingStyle,\n horizontalRuleObject,\n orderedList,\n unorderedList,\n })\n\n const unregisterBehaviors = behaviors.map((behavior) =>\n editor.registerBehavior({behavior}),\n )\n\n return () => {\n for (const unregisterBehavior of unregisterBehaviors) {\n unregisterBehavior()\n }\n }\n }, [\n blockquoteStyle,\n defaultStyle,\n editor,\n headingStyle,\n horizontalRuleObject,\n orderedList,\n unorderedList,\n ])\n\n return (\n <>\n {boldDecorator ? (\n <>\n <CharacterPairDecoratorPlugin\n decorator={boldDecorator}\n pair={{char: '*', amount: 2}}\n />\n <CharacterPairDecoratorPlugin\n decorator={boldDecorator}\n pair={{char: '_', amount: 2}}\n />\n </>\n ) : null}\n {codeDecorator ? (\n <CharacterPairDecoratorPlugin\n decorator={codeDecorator}\n pair={{char: '`', amount: 1}}\n />\n ) : null}\n {italicDecorator ? (\n <>\n <CharacterPairDecoratorPlugin\n decorator={italicDecorator}\n pair={{char: '*', amount: 1}}\n />\n <CharacterPairDecoratorPlugin\n decorator={italicDecorator}\n pair={{char: '_', amount: 1}}\n />\n </>\n ) : null}\n {strikeThroughDecorator ? (\n <CharacterPairDecoratorPlugin\n decorator={strikeThroughDecorator}\n pair={{char: '~', amount: 2}}\n />\n ) : null}\n </>\n )\n}\n"],"names":["createMarkdownBehaviors","config","automaticBlockquoteOnSpace","defineBehavior","on","guard","snapshot","event","text","selectionCollapsed","selectors","isSelectionCollapsed","focusTextBlock","getFocusTextBlock","focusSpan","getFocusSpan","previousInlineObject","getPreviousInlineObject","blockOffset","utils","spanSelectionPointToBlockOffset","context","selectionPoint","path","_key","node","offset","selection","focus","blockText","getTextBlockText","caretAtTheEndOfQuote","looksLikeMarkdownQuote","test","blockquoteStyle","schema","undefined","style","actions","execute","type","_","props","at","anchor","automaticHr","hrCharacter","hrObject","horizontalRuleObject","focusBlock","textBefore","getBlockTextBefore","hrBlockOffsets","block","_type","name","value","placement","select","automaticHrOnPaste","originEvent","dataTransfer","getData","hrRegExp","hrCharacters","match","getFocusBlock","children","automaticHeadingOnSpace","markdownHeadingSearch","exec","level","length","caretAtTheEndOfHeading","headingStyle","clearStyleOnBackspace","atTheBeginningOfBLock","defaultStyle","automaticListOnSpace","looksLikeUnorderedList","unorderedList","caretAtTheEndOfUnorderedList","listItem","listItemLength","looksLikeOrderedList","orderedList","caretAtTheEndOfOrderedList","MarkdownShortcutsPlugin","t0","$","_c","boldDecorator","codeDecorator","italicDecorator","strikeThroughDecorator","editor","useEditor","t1","t2","unregisterBehaviors","map","behavior","registerBehavior","unregisterBehavior","useEffect","t3","char","amount","t4","t5","t6","t7"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/behavior.markdown-shortcuts.ts","../src/rule.horizontal-rule.ts","../src/plugin.markdown-shortcuts.tsx"],"sourcesContent":["import type {EditorSchema} from '@portabletext/editor'\nimport {defineBehavior, execute} from '@portabletext/editor/behaviors'\nimport * as selectors from '@portabletext/editor/selectors'\nimport * as utils from '@portabletext/editor/utils'\n\nexport type MarkdownBehaviorsConfig = {\n horizontalRuleObject?: (context: {\n schema: EditorSchema\n }) => {name: string; value?: {[prop: string]: unknown}} | undefined\n defaultStyle?: (context: {schema: EditorSchema}) => string | undefined\n headingStyle?: (context: {\n schema: EditorSchema\n level: number\n }) => string | undefined\n blockquoteStyle?: (context: {schema: EditorSchema}) => string | undefined\n unorderedList?: (context: {schema: EditorSchema}) => string | undefined\n orderedList?: (context: {schema: EditorSchema}) => string | undefined\n}\n\nexport function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {\n const automaticBlockquoteOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const blockOffset = utils.spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (previousInlineObject || !blockOffset) {\n return false\n }\n\n const blockText = utils.getTextBlockText(focusTextBlock.node)\n const caretAtTheEndOfQuote = blockOffset.offset === 1\n const looksLikeMarkdownQuote = /^>/.test(blockText)\n const blockquoteStyle = config.blockquoteStyle?.({\n schema: snapshot.context.schema,\n })\n\n if (\n caretAtTheEndOfQuote &&\n looksLikeMarkdownQuote &&\n blockquoteStyle !== undefined\n ) {\n return {focusTextBlock, style: blockquoteStyle}\n }\n\n return false\n },\n actions: [\n () => [\n execute({\n type: 'insert.text',\n text: ' ',\n }),\n ],\n (_, {focusTextBlock, style}) => [\n execute({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n }),\n execute({\n type: 'block.set',\n props: {style},\n at: focusTextBlock.path,\n }),\n execute({\n type: 'delete.text',\n at: {\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: 2,\n },\n },\n }),\n ],\n ],\n })\n const automaticHrOnPaste = defineBehavior({\n on: 'clipboard.paste',\n guard: ({snapshot, event}) => {\n const text = event.originEvent.dataTransfer.getData('text/plain')\n const hrRegExp = /^(---)$|^(—-)$|^(___)$|^(\\*\\*\\*)$/\n const hrCharacters = text.match(hrRegExp)?.[0]\n const hrObject = config.horizontalRuleObject?.({\n schema: snapshot.context.schema,\n })\n const focusBlock = selectors.getFocusBlock(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n\n if (!hrCharacters || !hrObject || !focusBlock) {\n return false\n }\n\n return {hrCharacters, hrObject, focusBlock, focusTextBlock}\n },\n actions: [\n (_, {hrCharacters}) => [\n execute({\n type: 'insert.text',\n text: hrCharacters,\n }),\n ],\n ({snapshot}, {hrObject, focusBlock, focusTextBlock}) =>\n focusTextBlock\n ? [\n execute({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n children: focusTextBlock.node.children,\n },\n placement: 'after',\n }),\n execute({\n type: 'insert.block',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\n placement: 'after',\n }),\n execute({\n type: 'delete.block',\n at: focusBlock.path,\n }),\n ]\n : [\n execute({\n type: 'insert.block',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\n placement: 'after',\n }),\n ],\n ],\n })\n const automaticHeadingOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = utils.spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!blockOffset) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const blockText = utils.getTextBlockText(focusTextBlock.node)\n const markdownHeadingSearch = /^#+/.exec(blockText)\n const level = markdownHeadingSearch\n ? markdownHeadingSearch[0].length\n : undefined\n const caretAtTheEndOfHeading = blockOffset.offset === level\n\n if (previousInlineObject || !caretAtTheEndOfHeading) {\n return false\n }\n\n const style =\n level !== undefined\n ? config.headingStyle?.({schema: snapshot.context.schema, level})\n : undefined\n\n if (level !== undefined && style !== undefined) {\n return {\n focusTextBlock,\n style: style,\n level,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [execute(event)],\n (_, {focusTextBlock, style, level}) => [\n execute({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n }),\n execute({\n type: 'block.set',\n props: {style},\n at: focusTextBlock.path,\n }),\n execute({\n type: 'delete.text',\n at: {\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: level + 1,\n },\n },\n }),\n ],\n ],\n })\n const clearStyleOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n snapshot.context.selection?.focus.offset === 0\n\n const defaultStyle = config.defaultStyle?.({\n schema: snapshot.context.schema,\n })\n\n if (\n atTheBeginningOfBLock &&\n defaultStyle &&\n focusTextBlock.node.style !== defaultStyle\n ) {\n return {defaultStyle, focusTextBlock}\n }\n\n return false\n },\n actions: [\n (_, {defaultStyle, focusTextBlock}) => [\n execute({\n type: 'block.set',\n props: {style: defaultStyle},\n at: focusTextBlock.path,\n }),\n ],\n ],\n })\n const automaticListOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const blockOffset = utils.spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (previousInlineObject || !blockOffset) {\n return false\n }\n\n const blockText = utils.getTextBlockText(focusTextBlock.node)\n const defaultStyle = config.defaultStyle?.({\n schema: snapshot.context.schema,\n })\n const looksLikeUnorderedList = /^(-|\\*)/.test(blockText)\n const unorderedList = config.unorderedList?.({\n schema: snapshot.context.schema,\n })\n const caretAtTheEndOfUnorderedList = blockOffset.offset === 1\n\n if (\n defaultStyle &&\n caretAtTheEndOfUnorderedList &&\n looksLikeUnorderedList &&\n unorderedList !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: unorderedList,\n listItemLength: 1,\n style: defaultStyle,\n }\n }\n\n const looksLikeOrderedList = /^1\\./.test(blockText)\n const orderedList = config.orderedList?.({\n schema: snapshot.context.schema,\n })\n const caretAtTheEndOfOrderedList = blockOffset.offset === 2\n\n if (\n defaultStyle &&\n caretAtTheEndOfOrderedList &&\n looksLikeOrderedList &&\n orderedList !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: orderedList,\n listItemLength: 2,\n style: defaultStyle,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [execute(event)],\n (_, {focusTextBlock, style, listItem, listItemLength}) => [\n execute({\n type: 'block.set',\n props: {\n listItem,\n level: 1,\n style,\n },\n at: focusTextBlock.path,\n }),\n execute({\n type: 'delete.text',\n at: {\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: listItemLength + 1,\n },\n },\n }),\n ],\n ],\n })\n\n const markdownBehaviors = [\n automaticBlockquoteOnSpace,\n automaticHeadingOnSpace,\n automaticHrOnPaste,\n clearStyleOnBackspace,\n automaticListOnSpace,\n ]\n\n return markdownBehaviors\n}\n","import type {EditorSchema} from '@portabletext/editor'\nimport {raise} from '@portabletext/editor/behaviors'\nimport {getPreviousInlineObject} from '@portabletext/editor/selectors'\nimport {defineInputRule} from '@portabletext/plugin-input-rule'\n\nexport function createHorizontalRuleRule(config: {\n horizontalRuleObject: (context: {\n schema: EditorSchema\n }) => {name: string; value?: {[prop: string]: unknown}} | undefined\n}) {\n return defineInputRule({\n on: /^(---)|^(—-)|^(___)|^(\\*\\*\\*)/,\n guard: ({snapshot, event}) => {\n const hrObject = config.horizontalRuleObject({\n schema: snapshot.context.schema,\n })\n\n if (!hrObject) {\n // If no horizontal rule object is provided, then we can safely skip\n // this rule.\n return false\n }\n\n const previousInlineObject = getPreviousInlineObject(snapshot)\n\n if (previousInlineObject) {\n // Input Rules only look at the plain text of the text block. This\n // means that the RegExp is matched even if there is a leading inline\n // object.\n return false\n }\n\n // In theory, an Input Rule could return multiple matches. But in this\n // case we only expect one match.\n const match = event.matches.at(0)\n\n if (!match) {\n return false\n }\n\n return {hrObject, match}\n },\n actions: [\n (_, {hrObject, match}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\n placement: 'before',\n select: 'none',\n }),\n raise({\n type: 'delete',\n at: match.targetOffsets,\n }),\n ],\n ],\n })\n}\n","import {useEditor} from '@portabletext/editor'\nimport type {EditorSchema} from '@portabletext/editor'\nimport {CharacterPairDecoratorPlugin} from '@portabletext/plugin-character-pair-decorator'\nimport {InputRulePlugin} from '@portabletext/plugin-input-rule'\nimport {useEffect} from 'react'\nimport {\n createMarkdownBehaviors,\n type MarkdownBehaviorsConfig,\n} from './behavior.markdown-shortcuts'\nimport {createHorizontalRuleRule} from './rule.horizontal-rule'\n\n/**\n * @beta\n */\nexport type MarkdownShortcutsPluginProps = MarkdownBehaviorsConfig & {\n boldDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n codeDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n italicDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n strikeThroughDecorator?: ({\n schema,\n }: {\n schema: EditorSchema\n }) => string | undefined\n}\n\n/**\n * @beta\n */\nexport function MarkdownShortcutsPlugin({\n blockquoteStyle,\n boldDecorator,\n codeDecorator,\n defaultStyle,\n headingStyle,\n horizontalRuleObject,\n italicDecorator,\n orderedList,\n strikeThroughDecorator,\n unorderedList,\n}: MarkdownShortcutsPluginProps) {\n const editor = useEditor()\n\n useEffect(() => {\n const behaviors = createMarkdownBehaviors({\n blockquoteStyle,\n defaultStyle,\n headingStyle,\n horizontalRuleObject,\n orderedList,\n unorderedList,\n })\n\n const unregisterBehaviors = behaviors.map((behavior) =>\n editor.registerBehavior({behavior}),\n )\n\n return () => {\n for (const unregisterBehavior of unregisterBehaviors) {\n unregisterBehavior()\n }\n }\n }, [\n blockquoteStyle,\n defaultStyle,\n editor,\n headingStyle,\n horizontalRuleObject,\n orderedList,\n unorderedList,\n ])\n\n return (\n <>\n {boldDecorator ? (\n <>\n <CharacterPairDecoratorPlugin\n decorator={boldDecorator}\n pair={{char: '*', amount: 2}}\n />\n <CharacterPairDecoratorPlugin\n decorator={boldDecorator}\n pair={{char: '_', amount: 2}}\n />\n </>\n ) : null}\n {codeDecorator ? (\n <CharacterPairDecoratorPlugin\n decorator={codeDecorator}\n pair={{char: '`', amount: 1}}\n />\n ) : null}\n {italicDecorator ? (\n <>\n <CharacterPairDecoratorPlugin\n decorator={italicDecorator}\n pair={{char: '*', amount: 1}}\n />\n <CharacterPairDecoratorPlugin\n decorator={italicDecorator}\n pair={{char: '_', amount: 1}}\n />\n </>\n ) : null}\n {strikeThroughDecorator ? (\n <CharacterPairDecoratorPlugin\n decorator={strikeThroughDecorator}\n pair={{char: '~', amount: 2}}\n />\n ) : null}\n {horizontalRuleObject ? (\n <InputRulePlugin\n rules={[createHorizontalRuleRule({horizontalRuleObject})]}\n />\n ) : null}\n </>\n )\n}\n"],"names":["createMarkdownBehaviors","config","automaticBlockquoteOnSpace","defineBehavior","on","guard","snapshot","event","text","selectionCollapsed","selectors","isSelectionCollapsed","focusTextBlock","getFocusTextBlock","focusSpan","getFocusSpan","previousInlineObject","getPreviousInlineObject","blockOffset","utils","spanSelectionPointToBlockOffset","context","selectionPoint","path","_key","node","offset","selection","focus","blockText","getTextBlockText","caretAtTheEndOfQuote","looksLikeMarkdownQuote","test","blockquoteStyle","schema","undefined","style","actions","execute","type","_","props","at","anchor","automaticHrOnPaste","originEvent","dataTransfer","getData","hrRegExp","hrCharacters","match","hrObject","horizontalRuleObject","focusBlock","getFocusBlock","block","_type","name","children","placement","value","automaticHeadingOnSpace","markdownHeadingSearch","exec","level","length","caretAtTheEndOfHeading","headingStyle","clearStyleOnBackspace","atTheBeginningOfBLock","defaultStyle","automaticListOnSpace","looksLikeUnorderedList","unorderedList","caretAtTheEndOfUnorderedList","listItem","listItemLength","looksLikeOrderedList","orderedList","caretAtTheEndOfOrderedList","createHorizontalRuleRule","defineInputRule","matches","raise","select","targetOffsets","MarkdownShortcutsPlugin","t0","$","_c","boldDecorator","codeDecorator","italicDecorator","strikeThroughDecorator","editor","useEditor","t1","t2","unregisterBehaviors","map","behavior","registerBehavior","unregisterBehavior","useEffect","t3","char","amount","t4","t5","t6","t7","t8"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@portabletext/plugin-markdown-shortcuts",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Adds helpful Markdown shortcuts to the editor",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"portabletext",
|
|
@@ -39,7 +39,8 @@
|
|
|
39
39
|
"dist"
|
|
40
40
|
],
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@portabletext/plugin-character-pair-decorator": "^1.1.3"
|
|
42
|
+
"@portabletext/plugin-character-pair-decorator": "^1.1.3",
|
|
43
|
+
"@portabletext/plugin-input-rule": "0.3.0"
|
|
43
44
|
},
|
|
44
45
|
"devDependencies": {
|
|
45
46
|
"@types/react": "^19.1.12",
|
|
@@ -103,83 +103,11 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
|
|
|
103
103
|
],
|
|
104
104
|
],
|
|
105
105
|
})
|
|
106
|
-
const automaticHr = defineBehavior({
|
|
107
|
-
on: 'insert.text',
|
|
108
|
-
guard: ({snapshot, event}) => {
|
|
109
|
-
const hrCharacter =
|
|
110
|
-
event.text === '-'
|
|
111
|
-
? '-'
|
|
112
|
-
: event.text === '*'
|
|
113
|
-
? '*'
|
|
114
|
-
: event.text === '_'
|
|
115
|
-
? '_'
|
|
116
|
-
: undefined
|
|
117
|
-
|
|
118
|
-
if (hrCharacter === undefined) {
|
|
119
|
-
return false
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
const hrObject = config.horizontalRuleObject?.({
|
|
123
|
-
schema: snapshot.context.schema,
|
|
124
|
-
})
|
|
125
|
-
const focusBlock = selectors.getFocusTextBlock(snapshot)
|
|
126
|
-
const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)
|
|
127
|
-
|
|
128
|
-
if (!hrObject || !focusBlock || !selectionCollapsed) {
|
|
129
|
-
return false
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
const previousInlineObject = selectors.getPreviousInlineObject(snapshot)
|
|
133
|
-
const textBefore = selectors.getBlockTextBefore(snapshot)
|
|
134
|
-
const hrBlockOffsets = {
|
|
135
|
-
anchor: {
|
|
136
|
-
path: focusBlock.path,
|
|
137
|
-
offset: 0,
|
|
138
|
-
},
|
|
139
|
-
focus: {
|
|
140
|
-
path: focusBlock.path,
|
|
141
|
-
offset: 3,
|
|
142
|
-
},
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
if (
|
|
146
|
-
!previousInlineObject &&
|
|
147
|
-
textBefore === `${hrCharacter}${hrCharacter}`
|
|
148
|
-
) {
|
|
149
|
-
return {hrObject, focusBlock, hrCharacter, hrBlockOffsets}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
return false
|
|
153
|
-
},
|
|
154
|
-
actions: [
|
|
155
|
-
(_, {hrCharacter}) => [
|
|
156
|
-
execute({
|
|
157
|
-
type: 'insert.text',
|
|
158
|
-
text: hrCharacter,
|
|
159
|
-
}),
|
|
160
|
-
],
|
|
161
|
-
(_, {hrObject, hrBlockOffsets}) => [
|
|
162
|
-
execute({
|
|
163
|
-
type: 'insert.block',
|
|
164
|
-
block: {
|
|
165
|
-
_type: hrObject.name,
|
|
166
|
-
...(hrObject.value ?? {}),
|
|
167
|
-
},
|
|
168
|
-
placement: 'before',
|
|
169
|
-
select: 'none',
|
|
170
|
-
}),
|
|
171
|
-
execute({
|
|
172
|
-
type: 'delete.text',
|
|
173
|
-
at: hrBlockOffsets,
|
|
174
|
-
}),
|
|
175
|
-
],
|
|
176
|
-
],
|
|
177
|
-
})
|
|
178
106
|
const automaticHrOnPaste = defineBehavior({
|
|
179
107
|
on: 'clipboard.paste',
|
|
180
108
|
guard: ({snapshot, event}) => {
|
|
181
109
|
const text = event.originEvent.dataTransfer.getData('text/plain')
|
|
182
|
-
const hrRegExp = /^(---)
|
|
110
|
+
const hrRegExp = /^(---)$|^(—-)$|^(___)$|^(\*\*\*)$/
|
|
183
111
|
const hrCharacters = text.match(hrRegExp)?.[0]
|
|
184
112
|
const hrObject = config.horizontalRuleObject?.({
|
|
185
113
|
schema: snapshot.context.schema,
|
|
@@ -476,7 +404,6 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
|
|
|
476
404
|
const markdownBehaviors = [
|
|
477
405
|
automaticBlockquoteOnSpace,
|
|
478
406
|
automaticHeadingOnSpace,
|
|
479
|
-
automaticHr,
|
|
480
407
|
automaticHrOnPaste,
|
|
481
408
|
clearStyleOnBackspace,
|
|
482
409
|
automaticListOnSpace,
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import {useEditor} from '@portabletext/editor'
|
|
2
2
|
import type {EditorSchema} from '@portabletext/editor'
|
|
3
3
|
import {CharacterPairDecoratorPlugin} from '@portabletext/plugin-character-pair-decorator'
|
|
4
|
+
import {InputRulePlugin} from '@portabletext/plugin-input-rule'
|
|
4
5
|
import {useEffect} from 'react'
|
|
5
6
|
import {
|
|
6
7
|
createMarkdownBehaviors,
|
|
7
8
|
type MarkdownBehaviorsConfig,
|
|
8
9
|
} from './behavior.markdown-shortcuts'
|
|
10
|
+
import {createHorizontalRuleRule} from './rule.horizontal-rule'
|
|
9
11
|
|
|
10
12
|
/**
|
|
11
13
|
* @beta
|
|
@@ -105,6 +107,11 @@ export function MarkdownShortcutsPlugin({
|
|
|
105
107
|
pair={{char: '~', amount: 2}}
|
|
106
108
|
/>
|
|
107
109
|
) : null}
|
|
110
|
+
{horizontalRuleObject ? (
|
|
111
|
+
<InputRulePlugin
|
|
112
|
+
rules={[createHorizontalRuleRule({horizontalRuleObject})]}
|
|
113
|
+
/>
|
|
114
|
+
) : null}
|
|
108
115
|
</>
|
|
109
116
|
)
|
|
110
117
|
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type {EditorSchema} from '@portabletext/editor'
|
|
2
|
+
import {raise} from '@portabletext/editor/behaviors'
|
|
3
|
+
import {getPreviousInlineObject} from '@portabletext/editor/selectors'
|
|
4
|
+
import {defineInputRule} from '@portabletext/plugin-input-rule'
|
|
5
|
+
|
|
6
|
+
export function createHorizontalRuleRule(config: {
|
|
7
|
+
horizontalRuleObject: (context: {
|
|
8
|
+
schema: EditorSchema
|
|
9
|
+
}) => {name: string; value?: {[prop: string]: unknown}} | undefined
|
|
10
|
+
}) {
|
|
11
|
+
return defineInputRule({
|
|
12
|
+
on: /^(---)|^(—-)|^(___)|^(\*\*\*)/,
|
|
13
|
+
guard: ({snapshot, event}) => {
|
|
14
|
+
const hrObject = config.horizontalRuleObject({
|
|
15
|
+
schema: snapshot.context.schema,
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
if (!hrObject) {
|
|
19
|
+
// If no horizontal rule object is provided, then we can safely skip
|
|
20
|
+
// this rule.
|
|
21
|
+
return false
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const previousInlineObject = getPreviousInlineObject(snapshot)
|
|
25
|
+
|
|
26
|
+
if (previousInlineObject) {
|
|
27
|
+
// Input Rules only look at the plain text of the text block. This
|
|
28
|
+
// means that the RegExp is matched even if there is a leading inline
|
|
29
|
+
// object.
|
|
30
|
+
return false
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// In theory, an Input Rule could return multiple matches. But in this
|
|
34
|
+
// case we only expect one match.
|
|
35
|
+
const match = event.matches.at(0)
|
|
36
|
+
|
|
37
|
+
if (!match) {
|
|
38
|
+
return false
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return {hrObject, match}
|
|
42
|
+
},
|
|
43
|
+
actions: [
|
|
44
|
+
(_, {hrObject, match}) => [
|
|
45
|
+
raise({
|
|
46
|
+
type: 'insert.block',
|
|
47
|
+
block: {
|
|
48
|
+
_type: hrObject.name,
|
|
49
|
+
...(hrObject.value ?? {}),
|
|
50
|
+
},
|
|
51
|
+
placement: 'before',
|
|
52
|
+
select: 'none',
|
|
53
|
+
}),
|
|
54
|
+
raise({
|
|
55
|
+
type: 'delete',
|
|
56
|
+
at: match.targetOffsets,
|
|
57
|
+
}),
|
|
58
|
+
],
|
|
59
|
+
],
|
|
60
|
+
})
|
|
61
|
+
}
|