@portabletext/plugin-markdown-shortcuts 2.0.0 → 3.0.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/README.md +24 -7
- package/dist/index.d.ts +74 -33
- package/dist/index.js +51 -32
- package/dist/index.js.map +1 -1
- package/package.json +10 -10
- package/src/behavior.markdown-shortcuts.ts +31 -22
- package/src/plugin.markdown-shortcuts.tsx +54 -19
- package/src/rule.blockquote.ts +7 -3
- package/src/rule.heading.ts +9 -6
- package/src/rule.horizontal-rule.ts +12 -9
- package/src/rule.markdown-link.test.tsx +3 -5
- package/src/rule.markdown-link.ts +19 -9
- package/src/rule.ordered-list.ts +7 -3
- package/src/rule.unordered-list.ts +7 -3
package/README.md
CHANGED
|
@@ -14,6 +14,7 @@ import {MarkdownShortcutsPlugin} from '@portabletext/plugin-markdown-shortcuts'
|
|
|
14
14
|
|
|
15
15
|
const schemaDefinition = defineSchema({
|
|
16
16
|
blockObjects: [{name: 'break'}],
|
|
17
|
+
annotations: [{name: 'link', fields: [{name: 'href', type: 'string'}]}]
|
|
17
18
|
decorators: [
|
|
18
19
|
{name: 'em'},
|
|
19
20
|
{name: 'code'},
|
|
@@ -70,16 +71,32 @@ function App() {
|
|
|
70
71
|
schema.lists.find((s) => s.name === 'bullet')?.name
|
|
71
72
|
}
|
|
72
73
|
horizontalRuleObject={({schema}) => {
|
|
73
|
-
const
|
|
74
|
-
(
|
|
75
|
-
)
|
|
76
|
-
|
|
74
|
+
const schemaType = schema.blockObjects.find(
|
|
75
|
+
(object) => object.name === 'break',
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
if (!schemaType) {
|
|
79
|
+
return undefined
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return {_type: schemaType.name}
|
|
77
83
|
}}
|
|
78
84
|
linkObject={({schema, href}) => {
|
|
79
|
-
const
|
|
85
|
+
const schemaType = schema.annotations.find(
|
|
80
86
|
(annotation) => annotation.name === 'link',
|
|
81
|
-
)
|
|
82
|
-
|
|
87
|
+
)
|
|
88
|
+
const hrefField = schemaType?.fields.find(
|
|
89
|
+
(field) => field.name === 'href' && field.type === 'string',
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
if (!schemaType || !hrefField) {
|
|
93
|
+
return undefined
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return {
|
|
97
|
+
_type: schemaType.name,
|
|
98
|
+
[hrefField.name]: href,
|
|
99
|
+
}
|
|
83
100
|
}}
|
|
84
101
|
/>
|
|
85
102
|
</EditorProvider>
|
package/dist/index.d.ts
CHANGED
|
@@ -1,20 +1,21 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type {EditorContext} from '@portabletext/editor'
|
|
2
2
|
import {JSX} from 'react'
|
|
3
3
|
|
|
4
4
|
declare type MarkdownBehaviorsConfig = {
|
|
5
|
-
horizontalRuleObject?: (
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
5
|
+
horizontalRuleObject?: ({
|
|
6
|
+
context,
|
|
7
|
+
}: {
|
|
8
|
+
context: Pick<EditorContext, 'schema' | 'keyGenerator'>
|
|
9
|
+
}) => ObjectWithOptionalKey | undefined
|
|
10
|
+
defaultStyle?: ({
|
|
11
|
+
context,
|
|
12
|
+
}: {
|
|
13
|
+
context: Pick<EditorContext, 'schema'>
|
|
14
|
+
}) => string | undefined
|
|
14
15
|
}
|
|
15
16
|
|
|
16
17
|
/**
|
|
17
|
-
* @
|
|
18
|
+
* @public
|
|
18
19
|
*/
|
|
19
20
|
export declare function MarkdownShortcutsPlugin({
|
|
20
21
|
blockquoteStyle,
|
|
@@ -31,33 +32,73 @@ export declare function MarkdownShortcutsPlugin({
|
|
|
31
32
|
}: MarkdownShortcutsPluginProps): JSX.Element
|
|
32
33
|
|
|
33
34
|
/**
|
|
34
|
-
* @
|
|
35
|
+
* @public
|
|
35
36
|
*/
|
|
36
37
|
export declare type MarkdownShortcutsPluginProps = MarkdownBehaviorsConfig & {
|
|
37
|
-
blockquoteStyle?: (
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
38
|
+
blockquoteStyle?: ({
|
|
39
|
+
context,
|
|
40
|
+
}: {
|
|
41
|
+
context: Pick<EditorContext, 'schema'>
|
|
42
|
+
}) => string | undefined
|
|
43
|
+
defaultStyle?: ({
|
|
44
|
+
context,
|
|
45
|
+
}: {
|
|
46
|
+
context: Pick<EditorContext, 'schema'>
|
|
47
|
+
}) => string | undefined
|
|
48
|
+
headingStyle?: ({
|
|
49
|
+
context,
|
|
50
|
+
props,
|
|
51
|
+
}: {
|
|
52
|
+
context: Pick<EditorContext, 'schema'>
|
|
53
|
+
props: {
|
|
54
|
+
level: number
|
|
55
|
+
}
|
|
56
|
+
}) => string | undefined
|
|
57
|
+
linkObject?: ({
|
|
58
|
+
context,
|
|
59
|
+
props,
|
|
60
|
+
}: {
|
|
61
|
+
context: Pick<EditorContext, 'schema' | 'keyGenerator'>
|
|
62
|
+
props: {
|
|
63
|
+
href: string
|
|
64
|
+
}
|
|
65
|
+
}) => ObjectWithOptionalKey | undefined
|
|
66
|
+
unorderedList?: ({
|
|
67
|
+
context,
|
|
68
|
+
}: {
|
|
69
|
+
context: Pick<EditorContext, 'schema'>
|
|
70
|
+
}) => string | undefined
|
|
71
|
+
orderedList?: ({
|
|
72
|
+
context,
|
|
73
|
+
}: {
|
|
74
|
+
context: Pick<EditorContext, 'schema'>
|
|
75
|
+
}) => string | undefined
|
|
76
|
+
boldDecorator?: ({
|
|
77
|
+
context,
|
|
78
|
+
}: {
|
|
79
|
+
context: Pick<EditorContext, 'schema'>
|
|
80
|
+
}) => string | undefined
|
|
81
|
+
codeDecorator?: ({
|
|
82
|
+
context,
|
|
83
|
+
}: {
|
|
84
|
+
context: Pick<EditorContext, 'schema'>
|
|
85
|
+
}) => string | undefined
|
|
86
|
+
italicDecorator?: ({
|
|
87
|
+
context,
|
|
88
|
+
}: {
|
|
89
|
+
context: Pick<EditorContext, 'schema'>
|
|
90
|
+
}) => string | undefined
|
|
56
91
|
strikeThroughDecorator?: ({
|
|
57
|
-
|
|
92
|
+
context,
|
|
58
93
|
}: {
|
|
59
|
-
|
|
94
|
+
context: Pick<EditorContext, 'schema'>
|
|
60
95
|
}) => string | undefined
|
|
61
96
|
}
|
|
62
97
|
|
|
98
|
+
declare type ObjectWithOptionalKey = {
|
|
99
|
+
_type: string
|
|
100
|
+
_key?: string
|
|
101
|
+
[other: string]: unknown
|
|
102
|
+
}
|
|
103
|
+
|
|
63
104
|
export {}
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,7 @@ import { useEditor } from "@portabletext/editor";
|
|
|
4
4
|
import { CharacterPairDecoratorPlugin } from "@portabletext/plugin-character-pair-decorator";
|
|
5
5
|
import { defineInputRule, InputRulePlugin } from "@portabletext/plugin-input-rule";
|
|
6
6
|
import { useEffect } from "react";
|
|
7
|
-
import { defineBehavior,
|
|
7
|
+
import { defineBehavior, raise } from "@portabletext/editor/behaviors";
|
|
8
8
|
import * as selectors from "@portabletext/editor/selectors";
|
|
9
9
|
import { getPreviousInlineObject } from "@portabletext/editor/selectors";
|
|
10
10
|
function createMarkdownBehaviors(config) {
|
|
@@ -15,7 +15,10 @@ function createMarkdownBehaviors(config) {
|
|
|
15
15
|
event
|
|
16
16
|
}) => {
|
|
17
17
|
const text = event.originEvent.dataTransfer.getData("text/plain"), hrRegExp = /^(---)$|^(—-)$|^(___)$|^(\*\*\*)$/, hrCharacters = text.match(hrRegExp)?.[0], hrObject = config.horizontalRuleObject?.({
|
|
18
|
-
|
|
18
|
+
context: {
|
|
19
|
+
schema: snapshot.context.schema,
|
|
20
|
+
keyGenerator: snapshot.context.keyGenerator
|
|
21
|
+
}
|
|
19
22
|
}), focusBlock = selectors.getFocusBlock(snapshot), focusTextBlock = selectors.getFocusTextBlock(snapshot);
|
|
20
23
|
return !hrCharacters || !hrObject || !focusBlock ? !1 : {
|
|
21
24
|
hrCharacters,
|
|
@@ -26,7 +29,7 @@ function createMarkdownBehaviors(config) {
|
|
|
26
29
|
},
|
|
27
30
|
actions: [(_, {
|
|
28
31
|
hrCharacters
|
|
29
|
-
}) => [
|
|
32
|
+
}) => [raise({
|
|
30
33
|
type: "insert.text",
|
|
31
34
|
text: hrCharacters
|
|
32
35
|
})], ({
|
|
@@ -35,29 +38,23 @@ function createMarkdownBehaviors(config) {
|
|
|
35
38
|
hrObject,
|
|
36
39
|
focusBlock,
|
|
37
40
|
focusTextBlock
|
|
38
|
-
}) => focusTextBlock ? [
|
|
41
|
+
}) => focusTextBlock ? [raise({
|
|
39
42
|
type: "insert.block",
|
|
40
43
|
block: {
|
|
41
44
|
_type: snapshot.context.schema.block.name,
|
|
42
45
|
children: focusTextBlock.node.children
|
|
43
46
|
},
|
|
44
47
|
placement: "after"
|
|
45
|
-
}),
|
|
48
|
+
}), raise({
|
|
46
49
|
type: "insert.block",
|
|
47
|
-
block:
|
|
48
|
-
_type: hrObject.name,
|
|
49
|
-
...hrObject.value ?? {}
|
|
50
|
-
},
|
|
50
|
+
block: hrObject,
|
|
51
51
|
placement: "after"
|
|
52
|
-
}),
|
|
52
|
+
}), raise({
|
|
53
53
|
type: "delete.block",
|
|
54
54
|
at: focusBlock.path
|
|
55
|
-
})] : [
|
|
55
|
+
})] : [raise({
|
|
56
56
|
type: "insert.block",
|
|
57
|
-
block:
|
|
58
|
-
_type: hrObject.name,
|
|
59
|
-
...hrObject.value ?? {}
|
|
60
|
-
},
|
|
57
|
+
block: hrObject,
|
|
61
58
|
placement: "after"
|
|
62
59
|
})]]
|
|
63
60
|
}), clearStyleOnBackspace = defineBehavior({
|
|
@@ -69,7 +66,9 @@ function createMarkdownBehaviors(config) {
|
|
|
69
66
|
if (!selectionCollapsed || !focusTextBlock || !focusSpan)
|
|
70
67
|
return !1;
|
|
71
68
|
const atTheBeginningOfBLock = focusTextBlock.node.children[0]._key === focusSpan.node._key && snapshot.context.selection?.focus.offset === 0, defaultStyle = config.defaultStyle?.({
|
|
72
|
-
|
|
69
|
+
context: {
|
|
70
|
+
schema: snapshot.context.schema
|
|
71
|
+
}
|
|
73
72
|
});
|
|
74
73
|
return atTheBeginningOfBLock && defaultStyle && focusTextBlock.node.style !== defaultStyle ? {
|
|
75
74
|
defaultStyle,
|
|
@@ -79,7 +78,7 @@ function createMarkdownBehaviors(config) {
|
|
|
79
78
|
actions: [(_, {
|
|
80
79
|
defaultStyle,
|
|
81
80
|
focusTextBlock
|
|
82
|
-
}) => [
|
|
81
|
+
}) => [raise({
|
|
83
82
|
type: "block.set",
|
|
84
83
|
props: {
|
|
85
84
|
style: defaultStyle
|
|
@@ -97,7 +96,9 @@ function createBlockquoteRule(config) {
|
|
|
97
96
|
event
|
|
98
97
|
}) => {
|
|
99
98
|
const style = config.blockquoteStyle({
|
|
100
|
-
|
|
99
|
+
context: {
|
|
100
|
+
schema: snapshot.context.schema
|
|
101
|
+
}
|
|
101
102
|
});
|
|
102
103
|
if (!style || getPreviousInlineObject(snapshot))
|
|
103
104
|
return !1;
|
|
@@ -141,8 +142,12 @@ function createHeadingRule(config) {
|
|
|
141
142
|
if (!match)
|
|
142
143
|
return !1;
|
|
143
144
|
const level = match.text.length - 1, style = config.headingStyle({
|
|
144
|
-
|
|
145
|
-
|
|
145
|
+
context: {
|
|
146
|
+
schema: snapshot.context.schema
|
|
147
|
+
},
|
|
148
|
+
props: {
|
|
149
|
+
level
|
|
150
|
+
}
|
|
146
151
|
});
|
|
147
152
|
return style ? {
|
|
148
153
|
match,
|
|
@@ -178,7 +183,10 @@ function createHorizontalRuleRule(config) {
|
|
|
178
183
|
event
|
|
179
184
|
}) => {
|
|
180
185
|
const hrObject = config.horizontalRuleObject({
|
|
181
|
-
|
|
186
|
+
context: {
|
|
187
|
+
schema: snapshot.context.schema,
|
|
188
|
+
keyGenerator: snapshot.context.keyGenerator
|
|
189
|
+
}
|
|
182
190
|
});
|
|
183
191
|
if (!hrObject || getPreviousInlineObject(snapshot))
|
|
184
192
|
return !1;
|
|
@@ -193,10 +201,7 @@ function createHorizontalRuleRule(config) {
|
|
|
193
201
|
match
|
|
194
202
|
}) => [raise({
|
|
195
203
|
type: "insert.block",
|
|
196
|
-
block:
|
|
197
|
-
_type: hrObject.name,
|
|
198
|
-
...hrObject.value ?? {}
|
|
199
|
-
},
|
|
204
|
+
block: hrObject,
|
|
200
205
|
placement: "before",
|
|
201
206
|
select: "none"
|
|
202
207
|
}), raise({
|
|
@@ -221,12 +226,21 @@ function createMarkdownLinkRule(config) {
|
|
|
221
226
|
continue;
|
|
222
227
|
textLengthDelta = textLengthDelta - (match.targetOffsets.focus.offset - match.targetOffsets.anchor.offset - textMatch.text.length);
|
|
223
228
|
const linkObject = config.linkObject({
|
|
224
|
-
|
|
225
|
-
|
|
229
|
+
context: {
|
|
230
|
+
schema: snapshot.context.schema,
|
|
231
|
+
keyGenerator: snapshot.context.keyGenerator
|
|
232
|
+
},
|
|
233
|
+
props: {
|
|
234
|
+
href: hrefMatch.text
|
|
235
|
+
}
|
|
226
236
|
});
|
|
227
237
|
if (!linkObject)
|
|
228
238
|
continue;
|
|
229
|
-
const
|
|
239
|
+
const {
|
|
240
|
+
_type,
|
|
241
|
+
_key,
|
|
242
|
+
...value
|
|
243
|
+
} = linkObject, leftSideOffsets = {
|
|
230
244
|
anchor: match.targetOffsets.anchor,
|
|
231
245
|
focus: textMatch.targetOffsets.anchor
|
|
232
246
|
}, rightSideOffsets = {
|
|
@@ -239,8 +253,9 @@ function createMarkdownLinkRule(config) {
|
|
|
239
253
|
})), actions.push(raise({
|
|
240
254
|
type: "annotation.add",
|
|
241
255
|
annotation: {
|
|
242
|
-
name:
|
|
243
|
-
|
|
256
|
+
name: _type,
|
|
257
|
+
_key,
|
|
258
|
+
value
|
|
244
259
|
}
|
|
245
260
|
})), actions.push(raise({
|
|
246
261
|
type: "delete",
|
|
@@ -272,7 +287,9 @@ function createOrderedListRule(config) {
|
|
|
272
287
|
event
|
|
273
288
|
}) => {
|
|
274
289
|
const orderedList = config.orderedList({
|
|
275
|
-
|
|
290
|
+
context: {
|
|
291
|
+
schema: snapshot.context.schema
|
|
292
|
+
}
|
|
276
293
|
});
|
|
277
294
|
if (!orderedList || getPreviousInlineObject(snapshot))
|
|
278
295
|
return !1;
|
|
@@ -312,7 +329,9 @@ function createUnorderedListRule(config) {
|
|
|
312
329
|
event
|
|
313
330
|
}) => {
|
|
314
331
|
const unorderedList = config.unorderedList({
|
|
315
|
-
|
|
332
|
+
context: {
|
|
333
|
+
schema: snapshot.context.schema
|
|
334
|
+
}
|
|
316
335
|
});
|
|
317
336
|
if (!unorderedList || getPreviousInlineObject(snapshot))
|
|
318
337
|
return !1;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/behavior.markdown-shortcuts.ts","../src/rule.blockquote.ts","../src/rule.heading.ts","../src/rule.horizontal-rule.ts","../src/rule.markdown-link.ts","../src/rule.ordered-list.ts","../src/rule.unordered-list.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'\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}\n\nexport function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {\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\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\n const markdownBehaviors = [automaticHrOnPaste, clearStyleOnBackspace]\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 createBlockquoteRule(config: {\n blockquoteStyle: (context: {schema: EditorSchema}) => string | undefined\n}) {\n return defineInputRule({\n on: /^> /,\n guard: ({snapshot, event}) => {\n const style = config.blockquoteStyle({\n schema: snapshot.context.schema,\n })\n\n if (!style) {\n return false\n }\n\n const previousInlineObject = getPreviousInlineObject(snapshot)\n\n if (previousInlineObject) {\n return false\n }\n\n const match = event.matches.at(0)\n\n if (!match) {\n return false\n }\n\n return {style, match}\n },\n actions: [\n ({event}, {style, match}) => [\n raise({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: event.focusTextBlock.path,\n }),\n raise({\n type: 'block.set',\n props: {style},\n at: event.focusTextBlock.path,\n }),\n raise({\n type: 'delete',\n at: match.targetOffsets,\n }),\n ],\n ],\n })\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 createHeadingRule(config: {\n headingStyle: (context: {\n schema: EditorSchema\n level: number\n }) => string | undefined\n}) {\n return defineInputRule({\n on: /^#+ /,\n guard: ({snapshot, event}) => {\n const previousInlineObject = getPreviousInlineObject(snapshot)\n\n if (previousInlineObject) {\n return false\n }\n\n const match = event.matches.at(0)\n\n if (!match) {\n return false\n }\n\n const level = match.text.length - 1\n\n const style = config.headingStyle({\n schema: snapshot.context.schema,\n level,\n })\n\n if (!style) {\n return false\n }\n\n return {match, style}\n },\n actions: [\n ({event}, {match, style}) => [\n raise({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: event.focusTextBlock.path,\n }),\n raise({\n type: 'block.set',\n props: {style},\n at: event.focusTextBlock.path,\n }),\n raise({\n type: 'delete',\n at: match.targetOffsets,\n }),\n ],\n ],\n })\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 type {EditorSchema} from '@portabletext/editor'\nimport {raise, type BehaviorAction} from '@portabletext/editor/behaviors'\nimport {defineInputRule} from '@portabletext/plugin-input-rule'\n\nexport function createMarkdownLinkRule(config: {\n linkObject: (context: {\n schema: EditorSchema\n href: string\n }) => {name: string; value?: {[prop: string]: unknown}} | undefined\n}) {\n return defineInputRule({\n on: /\\[([^[\\]]+)]\\((.+)\\)/,\n actions: [\n ({snapshot, event}) => {\n const newText = event.textBefore + event.textInserted\n let textLengthDelta = 0\n const actions: Array<BehaviorAction> = []\n\n for (const match of event.matches.reverse()) {\n const textMatch = match.groupMatches.at(0)\n const hrefMatch = match.groupMatches.at(1)\n\n if (textMatch === undefined || hrefMatch === undefined) {\n continue\n }\n\n textLengthDelta =\n textLengthDelta -\n (match.targetOffsets.focus.offset -\n match.targetOffsets.anchor.offset -\n textMatch.text.length)\n\n const linkObject = config.linkObject({\n schema: snapshot.context.schema,\n href: hrefMatch.text,\n })\n\n if (!linkObject) {\n continue\n }\n\n const leftSideOffsets = {\n anchor: match.targetOffsets.anchor,\n focus: textMatch.targetOffsets.anchor,\n }\n const rightSideOffsets = {\n anchor: textMatch.targetOffsets.focus,\n focus: match.targetOffsets.focus,\n }\n\n actions.push(\n raise({\n type: 'select',\n at: textMatch.targetOffsets,\n }),\n )\n actions.push(\n raise({\n type: 'annotation.add',\n annotation: {\n name: linkObject.name,\n value: linkObject.value ?? {},\n },\n }),\n )\n actions.push(\n raise({\n type: 'delete',\n at: rightSideOffsets,\n }),\n )\n actions.push(\n raise({\n type: 'delete',\n at: leftSideOffsets,\n }),\n )\n }\n\n const endCaretPosition = {\n path: event.focusTextBlock.path,\n offset: newText.length - textLengthDelta * -1,\n }\n\n return [\n ...actions,\n raise({\n type: 'select',\n at: {\n anchor: endCaretPosition,\n focus: endCaretPosition,\n },\n }),\n ]\n },\n ],\n })\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 createOrderedListRule(config: {\n orderedList: (context: {schema: EditorSchema}) => string | undefined\n}) {\n return defineInputRule({\n on: /^1\\. /,\n guard: ({snapshot, event}) => {\n const orderedList = config.orderedList({\n schema: snapshot.context.schema,\n })\n\n if (!orderedList) {\n return false\n }\n\n const previousInlineObject = getPreviousInlineObject(snapshot)\n\n if (previousInlineObject) {\n return false\n }\n\n const match = event.matches.at(0)\n\n if (!match) {\n return false\n }\n\n return {match, orderedList}\n },\n actions: [\n ({event}, {match, orderedList}) => [\n raise({\n type: 'block.unset',\n props: ['style'],\n at: event.focusTextBlock.path,\n }),\n raise({\n type: 'block.set',\n props: {\n listItem: orderedList,\n level: event.focusTextBlock.node.level ?? 1,\n },\n at: event.focusTextBlock.path,\n }),\n raise({\n type: 'delete',\n at: match.targetOffsets,\n }),\n ],\n ],\n })\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 createUnorderedListRule(config: {\n unorderedList: (context: {schema: EditorSchema}) => string | undefined\n}) {\n return defineInputRule({\n on: /^(-|\\*) /,\n guard: ({snapshot, event}) => {\n const unorderedList = config.unorderedList({\n schema: snapshot.context.schema,\n })\n\n if (!unorderedList) {\n return false\n }\n\n const previousInlineObject = getPreviousInlineObject(snapshot)\n\n if (previousInlineObject) {\n return false\n }\n\n const match = event.matches.at(0)\n\n if (!match) {\n return false\n }\n\n return {match, unorderedList}\n },\n actions: [\n ({event}, {match, unorderedList}) => [\n raise({\n type: 'block.unset',\n props: ['style'],\n at: event.focusTextBlock.path,\n }),\n raise({\n type: 'block.set',\n props: {\n listItem: unorderedList,\n level: event.focusTextBlock.node.level ?? 1,\n },\n at: event.focusTextBlock.path,\n }),\n raise({\n type: 'delete',\n at: match.targetOffsets,\n }),\n ],\n ],\n })\n}\n","import type {EditorSchema} from '@portabletext/editor'\nimport {useEditor} from '@portabletext/editor'\nimport {CharacterPairDecoratorPlugin} from '@portabletext/plugin-character-pair-decorator'\nimport {InputRulePlugin} from '@portabletext/plugin-input-rule'\nimport {useEffect, useMemo} from 'react'\nimport {\n createMarkdownBehaviors,\n type MarkdownBehaviorsConfig,\n} from './behavior.markdown-shortcuts'\nimport {createBlockquoteRule} from './rule.blockquote'\nimport {createHeadingRule} from './rule.heading'\nimport {createHorizontalRuleRule} from './rule.horizontal-rule'\nimport {createMarkdownLinkRule} from './rule.markdown-link'\nimport {createOrderedListRule} from './rule.ordered-list'\nimport {createUnorderedListRule} from './rule.unordered-list'\n\n/**\n * @beta\n */\nexport type MarkdownShortcutsPluginProps = MarkdownBehaviorsConfig & {\n blockquoteStyle?: (context: {schema: EditorSchema}) => string | undefined\n defaultStyle?: (context: {schema: EditorSchema}) => string | undefined\n headingStyle?: (context: {\n schema: EditorSchema\n level: number\n }) => string | undefined\n linkObject?: (context: {\n schema: EditorSchema\n href: string\n }) => {name: string; value?: {[prop: string]: unknown}} | undefined\n unorderedList?: (context: {schema: EditorSchema}) => string | undefined\n orderedList?: (context: {schema: EditorSchema}) => string | undefined\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 linkObject,\n italicDecorator,\n orderedList,\n strikeThroughDecorator,\n unorderedList,\n}: MarkdownShortcutsPluginProps) {\n const editor = useEditor()\n\n useEffect(() => {\n const behaviors = createMarkdownBehaviors({\n defaultStyle,\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 }, [defaultStyle, editor])\n\n const inputRules = useMemo(() => {\n const rules = []\n if (blockquoteStyle) {\n rules.push(createBlockquoteRule({blockquoteStyle}))\n }\n if (headingStyle) {\n rules.push(createHeadingRule({headingStyle}))\n }\n if (horizontalRuleObject) {\n rules.push(createHorizontalRuleRule({horizontalRuleObject}))\n }\n if (linkObject) {\n rules.push(createMarkdownLinkRule({linkObject}))\n }\n if (orderedList) {\n rules.push(createOrderedListRule({orderedList}))\n }\n if (unorderedList) {\n rules.push(createUnorderedListRule({unorderedList}))\n }\n return rules.length > 0 ? rules : null\n }, [\n blockquoteStyle,\n headingStyle,\n horizontalRuleObject,\n linkObject,\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 {inputRules ? <InputRulePlugin rules={inputRules} /> : null}\n </>\n )\n}\n"],"names":["createMarkdownBehaviors","config","automaticHrOnPaste","defineBehavior","on","guard","snapshot","event","text","originEvent","dataTransfer","getData","hrRegExp","hrCharacters","match","hrObject","horizontalRuleObject","schema","context","focusBlock","selectors","getFocusBlock","focusTextBlock","getFocusTextBlock","actions","_","execute","type","block","_type","name","children","node","placement","value","at","path","clearStyleOnBackspace","selectionCollapsed","isSelectionCollapsed","focusSpan","getFocusSpan","atTheBeginningOfBLock","_key","selection","focus","offset","defaultStyle","style","props","createBlockquoteRule","defineInputRule","blockquoteStyle","getPreviousInlineObject","matches","raise","targetOffsets","createHeadingRule","level","length","headingStyle","createHorizontalRuleRule","select","createMarkdownLinkRule","newText","textBefore","textInserted","textLengthDelta","reverse","textMatch","groupMatches","hrefMatch","undefined","anchor","linkObject","href","leftSideOffsets","rightSideOffsets","push","annotation","endCaretPosition","createOrderedListRule","orderedList","listItem","createUnorderedListRule","unorderedList","MarkdownShortcutsPlugin","t0","$","_c","boldDecorator","codeDecorator","italicDecorator","strikeThroughDecorator","editor","useEditor","t1","t2","unregisterBehaviors","map","behavior","registerBehavior","unregisterBehavior","useEffect","rules","t3","inputRules","char","amount","t4","t5","t6","t7","t8"],"mappings":";;;;;;;;;AAWO,SAASA,wBAAwBC,QAAiC;AACvE,QAAMC,qBAAqBC,eAAe;AAAA,IACxCC,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAUC;AAAAA,IAAAA,MAAW;AAC5B,YAAMC,OAAOD,MAAME,YAAYC,aAAaC,QAAQ,YAAY,GAC1DC,WAAW,qCACXC,eAAeL,KAAKM,MAAMF,QAAQ,IAAI,CAAC,GACvCG,WAAWd,OAAOe,uBAAuB;AAAA,QAC7CC,QAAQX,SAASY,QAAQD;AAAAA,MAAAA,CAC1B,GACKE,aAAaC,UAAUC,cAAcf,QAAQ,GAC7CgB,iBAAiBF,UAAUG,kBAAkBjB,QAAQ;AAE3D,aAAI,CAACO,gBAAgB,CAACE,YAAY,CAACI,aAC1B,KAGF;AAAA,QAACN;AAAAA,QAAcE;AAAAA,QAAUI;AAAAA,QAAYG;AAAAA,MAAAA;AAAAA,IAC9C;AAAA,IACAE,SAAS,CACP,CAACC,GAAG;AAAA,MAACZ;AAAAA,IAAAA,MAAkB,CACrBa,QAAQ;AAAA,MACNC,MAAM;AAAA,MACNnB,MAAMK;AAAAA,IAAAA,CACP,CAAC,GAEJ,CAAC;AAAA,MAACP;AAAAA,IAAAA,GAAW;AAAA,MAACS;AAAAA,MAAUI;AAAAA,MAAYG;AAAAA,IAAAA,MAClCA,iBACI,CACEI,QAAQ;AAAA,MACNC,MAAM;AAAA,MACNC,OAAO;AAAA,QACLC,OAAOvB,SAASY,QAAQD,OAAOW,MAAME;AAAAA,QACrCC,UAAUT,eAAeU,KAAKD;AAAAA,MAAAA;AAAAA,MAEhCE,WAAW;AAAA,IAAA,CACZ,GACDP,QAAQ;AAAA,MACNC,MAAM;AAAA,MACNC,OAAO;AAAA,QACLC,OAAOd,SAASe;AAAAA,QAChB,GAAIf,SAASmB,SAAS,CAAA;AAAA,MAAC;AAAA,MAEzBD,WAAW;AAAA,IAAA,CACZ,GACDP,QAAQ;AAAA,MACNC,MAAM;AAAA,MACNQ,IAAIhB,WAAWiB;AAAAA,IAAAA,CAChB,CAAC,IAEJ,CACEV,QAAQ;AAAA,MACNC,MAAM;AAAA,MACNC,OAAO;AAAA,QACLC,OAAOd,SAASe;AAAAA,QAChB,GAAIf,SAASmB,SAAS,CAAA;AAAA,MAAC;AAAA,MAEzBD,WAAW;AAAA,IAAA,CACZ,CAAC,CACH;AAAA,EAAA,CAEV,GAEKI,wBAAwBlC,eAAe;AAAA,IAC3CC,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,IAAAA,MAAc;AACrB,YAAMgC,qBAAqBlB,UAAUmB,qBAAqBjC,QAAQ,GAC5DgB,iBAAiBF,UAAUG,kBAAkBjB,QAAQ,GACrDkC,YAAYpB,UAAUqB,aAAanC,QAAQ;AAEjD,UAAI,CAACgC,sBAAsB,CAAChB,kBAAkB,CAACkB;AAC7C,eAAO;AAGT,YAAME,wBACJpB,eAAeU,KAAKD,SAAS,CAAC,EAAEY,SAASH,UAAUR,KAAKW,QACxDrC,SAASY,QAAQ0B,WAAWC,MAAMC,WAAW,GAEzCC,eAAe9C,OAAO8C,eAAe;AAAA,QACzC9B,QAAQX,SAASY,QAAQD;AAAAA,MAAAA,CAC1B;AAED,aACEyB,yBACAK,gBACAzB,eAAeU,KAAKgB,UAAUD,eAEvB;AAAA,QAACA;AAAAA,QAAczB;AAAAA,MAAAA,IAGjB;AAAA,IACT;AAAA,IACAE,SAAS,CACP,CAACC,GAAG;AAAA,MAACsB;AAAAA,MAAczB;AAAAA,IAAAA,MAAoB,CACrCI,QAAQ;AAAA,MACNC,MAAM;AAAA,MACNsB,OAAO;AAAA,QAACD,OAAOD;AAAAA,MAAAA;AAAAA,MACfZ,IAAIb,eAAec;AAAAA,IAAAA,CACpB,CAAC,CACH;AAAA,EAAA,CAEJ;AAID,SAF0B,CAAClC,oBAAoBmC,qBAAqB;AAGtE;AChHO,SAASa,qBAAqBjD,QAElC;AACD,SAAOkD,gBAAgB;AAAA,IACrB/C,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAUC;AAAAA,IAAAA,MAAW;AAC5B,YAAMyC,QAAQ/C,OAAOmD,gBAAgB;AAAA,QACnCnC,QAAQX,SAASY,QAAQD;AAAAA,MAAAA,CAC1B;AAQD,UANI,CAAC+B,SAIwBK,wBAAwB/C,QAAQ;AAG3D,eAAO;AAGT,YAAMQ,QAAQP,MAAM+C,QAAQnB,GAAG,CAAC;AAEhC,aAAKrB,QAIE;AAAA,QAACkC;AAAAA,QAAOlC;AAAAA,MAAAA,IAHN;AAAA,IAIX;AAAA,IACAU,SAAS,CACP,CAAC;AAAA,MAACjB;AAAAA,IAAAA,GAAQ;AAAA,MAACyC;AAAAA,MAAOlC;AAAAA,IAAAA,MAAW,CAC3ByC,MAAM;AAAA,MACJ5B,MAAM;AAAA,MACNsB,OAAO,CAAC,YAAY,OAAO;AAAA,MAC3Bd,IAAI5B,MAAMe,eAAec;AAAAA,IAAAA,CAC1B,GACDmB,MAAM;AAAA,MACJ5B,MAAM;AAAA,MACNsB,OAAO;AAAA,QAACD;AAAAA,MAAAA;AAAAA,MACRb,IAAI5B,MAAMe,eAAec;AAAAA,IAAAA,CAC1B,GACDmB,MAAM;AAAA,MACJ5B,MAAM;AAAA,MACNQ,IAAIrB,MAAM0C;AAAAA,IAAAA,CACX,CAAC,CACH;AAAA,EAAA,CAEJ;AACH;AC/CO,SAASC,kBAAkBxD,QAK/B;AACD,SAAOkD,gBAAgB;AAAA,IACrB/C,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAUC;AAAAA,IAAAA,MAAW;AAG5B,UAF6B8C,wBAAwB/C,QAAQ;AAG3D,eAAO;AAGT,YAAMQ,QAAQP,MAAM+C,QAAQnB,GAAG,CAAC;AAEhC,UAAI,CAACrB;AACH,eAAO;AAGT,YAAM4C,QAAQ5C,MAAMN,KAAKmD,SAAS,GAE5BX,QAAQ/C,OAAO2D,aAAa;AAAA,QAChC3C,QAAQX,SAASY,QAAQD;AAAAA,QACzByC;AAAAA,MAAAA,CACD;AAED,aAAKV,QAIE;AAAA,QAAClC;AAAAA,QAAOkC;AAAAA,MAAAA,IAHN;AAAA,IAIX;AAAA,IACAxB,SAAS,CACP,CAAC;AAAA,MAACjB;AAAAA,IAAAA,GAAQ;AAAA,MAACO;AAAAA,MAAOkC;AAAAA,IAAAA,MAAW,CAC3BO,MAAM;AAAA,MACJ5B,MAAM;AAAA,MACNsB,OAAO,CAAC,YAAY,OAAO;AAAA,MAC3Bd,IAAI5B,MAAMe,eAAec;AAAAA,IAAAA,CAC1B,GACDmB,MAAM;AAAA,MACJ5B,MAAM;AAAA,MACNsB,OAAO;AAAA,QAACD;AAAAA,MAAAA;AAAAA,MACRb,IAAI5B,MAAMe,eAAec;AAAAA,IAAAA,CAC1B,GACDmB,MAAM;AAAA,MACJ5B,MAAM;AAAA,MACNQ,IAAIrB,MAAM0C;AAAAA,IAAAA,CACX,CAAC,CACH;AAAA,EAAA,CAEJ;AACH;ACrDO,SAASK,yBAAyB5D,QAItC;AACD,SAAOkD,gBAAgB;AAAA,IACrB/C,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAUC;AAAAA,IAAAA,MAAW;AAC5B,YAAMQ,WAAWd,OAAOe,qBAAqB;AAAA,QAC3CC,QAAQX,SAASY,QAAQD;AAAAA,MAAAA,CAC1B;AAUD,UARI,CAACF,YAMwBsC,wBAAwB/C,QAAQ;AAM3D,eAAO;AAKT,YAAMQ,QAAQP,MAAM+C,QAAQnB,GAAG,CAAC;AAEhC,aAAKrB,QAIE;AAAA,QAACC;AAAAA,QAAUD;AAAAA,MAAAA,IAHT;AAAA,IAIX;AAAA,IACAU,SAAS,CACP,CAACC,GAAG;AAAA,MAACV;AAAAA,MAAUD;AAAAA,IAAAA,MAAW,CACxByC,MAAM;AAAA,MACJ5B,MAAM;AAAA,MACNC,OAAO;AAAA,QACLC,OAAOd,SAASe;AAAAA,QAChB,GAAIf,SAASmB,SAAS,CAAA;AAAA,MAAC;AAAA,MAEzBD,WAAW;AAAA,MACX6B,QAAQ;AAAA,IAAA,CACT,GACDP,MAAM;AAAA,MACJ5B,MAAM;AAAA,MACNQ,IAAIrB,MAAM0C;AAAAA,IAAAA,CACX,CAAC,CACH;AAAA,EAAA,CAEJ;AACH;ACxDO,SAASO,uBAAuB9D,QAKpC;AACD,SAAOkD,gBAAgB;AAAA,IACrB/C,IAAI;AAAA,IACJoB,SAAS,CACP,CAAC;AAAA,MAAClB;AAAAA,MAAUC;AAAAA,IAAAA,MAAW;AACrB,YAAMyD,UAAUzD,MAAM0D,aAAa1D,MAAM2D;AACzC,UAAIC,kBAAkB;AACtB,YAAM3C,UAAiC,CAAA;AAEvC,iBAAWV,SAASP,MAAM+C,QAAQc,QAAAA,GAAW;AAC3C,cAAMC,YAAYvD,MAAMwD,aAAanC,GAAG,CAAC,GACnCoC,YAAYzD,MAAMwD,aAAanC,GAAG,CAAC;AAEzC,YAAIkC,cAAcG,UAAaD,cAAcC;AAC3C;AAGFL,0BACEA,mBACCrD,MAAM0C,cAAcX,MAAMC,SACzBhC,MAAM0C,cAAciB,OAAO3B,SAC3BuB,UAAU7D,KAAKmD;AAEnB,cAAMe,aAAazE,OAAOyE,WAAW;AAAA,UACnCzD,QAAQX,SAASY,QAAQD;AAAAA,UACzB0D,MAAMJ,UAAU/D;AAAAA,QAAAA,CACjB;AAED,YAAI,CAACkE;AACH;AAGF,cAAME,kBAAkB;AAAA,UACtBH,QAAQ3D,MAAM0C,cAAciB;AAAAA,UAC5B5B,OAAOwB,UAAUb,cAAciB;AAAAA,QAAAA,GAE3BI,mBAAmB;AAAA,UACvBJ,QAAQJ,UAAUb,cAAcX;AAAAA,UAChCA,OAAO/B,MAAM0C,cAAcX;AAAAA,QAAAA;AAG7BrB,gBAAQsD,KACNvB,MAAM;AAAA,UACJ5B,MAAM;AAAA,UACNQ,IAAIkC,UAAUb;AAAAA,QAAAA,CACf,CACH,GACAhC,QAAQsD,KACNvB,MAAM;AAAA,UACJ5B,MAAM;AAAA,UACNoD,YAAY;AAAA,YACVjD,MAAM4C,WAAW5C;AAAAA,YACjBI,OAAOwC,WAAWxC,SAAS,CAAA;AAAA,UAAC;AAAA,QAC9B,CACD,CACH,GACAV,QAAQsD,KACNvB,MAAM;AAAA,UACJ5B,MAAM;AAAA,UACNQ,IAAI0C;AAAAA,QAAAA,CACL,CACH,GACArD,QAAQsD,KACNvB,MAAM;AAAA,UACJ5B,MAAM;AAAA,UACNQ,IAAIyC;AAAAA,QAAAA,CACL,CACH;AAAA,MACF;AAEA,YAAMI,mBAAmB;AAAA,QACvB5C,MAAM7B,MAAMe,eAAec;AAAAA,QAC3BU,QAAQkB,QAAQL,SAASQ,kBAAkB;AAAA,MAAA;AAG7C,aAAO,CACL,GAAG3C,SACH+B,MAAM;AAAA,QACJ5B,MAAM;AAAA,QACNQ,IAAI;AAAA,UACFsC,QAAQO;AAAAA,UACRnC,OAAOmC;AAAAA,QAAAA;AAAAA,MACT,CACD,CAAC;AAAA,IAEN,CAAC;AAAA,EAAA,CAEJ;AACH;AC5FO,SAASC,sBAAsBhF,QAEnC;AACD,SAAOkD,gBAAgB;AAAA,IACrB/C,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAUC;AAAAA,IAAAA,MAAW;AAC5B,YAAM2E,cAAcjF,OAAOiF,YAAY;AAAA,QACrCjE,QAAQX,SAASY,QAAQD;AAAAA,MAAAA,CAC1B;AAQD,UANI,CAACiE,eAIwB7B,wBAAwB/C,QAAQ;AAG3D,eAAO;AAGT,YAAMQ,QAAQP,MAAM+C,QAAQnB,GAAG,CAAC;AAEhC,aAAKrB,QAIE;AAAA,QAACA;AAAAA,QAAOoE;AAAAA,MAAAA,IAHN;AAAA,IAIX;AAAA,IACA1D,SAAS,CACP,CAAC;AAAA,MAACjB;AAAAA,IAAAA,GAAQ;AAAA,MAACO;AAAAA,MAAOoE;AAAAA,IAAAA,MAAiB,CACjC3B,MAAM;AAAA,MACJ5B,MAAM;AAAA,MACNsB,OAAO,CAAC,OAAO;AAAA,MACfd,IAAI5B,MAAMe,eAAec;AAAAA,IAAAA,CAC1B,GACDmB,MAAM;AAAA,MACJ5B,MAAM;AAAA,MACNsB,OAAO;AAAA,QACLkC,UAAUD;AAAAA,QACVxB,OAAOnD,MAAMe,eAAeU,KAAK0B,SAAS;AAAA,MAAA;AAAA,MAE5CvB,IAAI5B,MAAMe,eAAec;AAAAA,IAAAA,CAC1B,GACDmB,MAAM;AAAA,MACJ5B,MAAM;AAAA,MACNQ,IAAIrB,MAAM0C;AAAAA,IAAAA,CACX,CAAC,CACH;AAAA,EAAA,CAEJ;AACH;AClDO,SAAS4B,wBAAwBnF,QAErC;AACD,SAAOkD,gBAAgB;AAAA,IACrB/C,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAUC;AAAAA,IAAAA,MAAW;AAC5B,YAAM8E,gBAAgBpF,OAAOoF,cAAc;AAAA,QACzCpE,QAAQX,SAASY,QAAQD;AAAAA,MAAAA,CAC1B;AAQD,UANI,CAACoE,iBAIwBhC,wBAAwB/C,QAAQ;AAG3D,eAAO;AAGT,YAAMQ,QAAQP,MAAM+C,QAAQnB,GAAG,CAAC;AAEhC,aAAKrB,QAIE;AAAA,QAACA;AAAAA,QAAOuE;AAAAA,MAAAA,IAHN;AAAA,IAIX;AAAA,IACA7D,SAAS,CACP,CAAC;AAAA,MAACjB;AAAAA,IAAAA,GAAQ;AAAA,MAACO;AAAAA,MAAOuE;AAAAA,IAAAA,MAAmB,CACnC9B,MAAM;AAAA,MACJ5B,MAAM;AAAA,MACNsB,OAAO,CAAC,OAAO;AAAA,MACfd,IAAI5B,MAAMe,eAAec;AAAAA,IAAAA,CAC1B,GACDmB,MAAM;AAAA,MACJ5B,MAAM;AAAA,MACNsB,OAAO;AAAA,QACLkC,UAAUE;AAAAA,QACV3B,OAAOnD,MAAMe,eAAeU,KAAK0B,SAAS;AAAA,MAAA;AAAA,MAE5CvB,IAAI5B,MAAMe,eAAec;AAAAA,IAAAA,CAC1B,GACDmB,MAAM;AAAA,MACJ5B,MAAM;AAAA,MACNQ,IAAIrB,MAAM0C;AAAAA,IAAAA,CACX,CAAC,CACH;AAAA,EAAA,CAEJ;AACH;ACVO,SAAA8B,wBAAAC,IAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GAAiC;AAAA,IAAArC;AAAAA,IAAAsC;AAAAA,IAAAC;AAAAA,IAAA5C;AAAAA,IAAAa;AAAAA,IAAA5C;AAAAA,IAAA0D;AAAAA,IAAAkB;AAAAA,IAAAV;AAAAA,IAAAW;AAAAA,IAAAR;AAAAA,EAAAA,IAAAE,IAatCO,SAAeC,UAAAA;AAAW,MAAAC,IAAAC;AAAAT,IAAA,CAAA,MAAAzC,gBAAAyC,SAAAM,UAEhBE,KAAAA,MAAA;AAKR,UAAAE,sBAJkBlG,wBAAwB;AAAA,MAAA+C;AAAAA,IAAAA,CAEzC,EAEoCoD,IAAKC,CAAAA,aACxCN,OAAMO,iBAAkB;AAAA,MAAAD;AAAAA,IAAAA,CAAU,CACpC;AAAC,WAEM,MAAA;AACL,iBAAKE,sBAA4BJ;AAC/BI,2BAAAA;AAAAA,IACD;AAAA,EACF,GACAL,KAAA,CAAClD,cAAc+C,MAAM,GAACN,OAAAzC,cAAAyC,OAAAM,QAAAN,OAAAQ,IAAAR,OAAAS,OAAAD,KAAAR,EAAA,CAAA,GAAAS,KAAAT,EAAA,CAAA,IAdzBe,UAAUP,IAcPC,EAAsB;AAAC,MAAAO;AAAA,MAAAhB,SAAApC,mBAAAoC,EAAA,CAAA,MAAA5B,gBAAA4B,EAAA,CAAA,MAAAxE,wBAAAwE,EAAA,CAAA,MAAAd,cAAAc,SAAAN,eAAAM,EAAA,CAAA,MAAAH,eAAA;AAIxB,QADAmB,QAAc,CAAA,GACVpD,iBAAe;AAAA,UAAAqD;AAAAjB,gBAAApC,mBACNqD,MAAAvD,qBAAqB;AAAA,QAAAE;AAAAA,MAAAA,CAAiB,GAACoC,QAAApC,iBAAAoC,QAAAiB,OAAAA,MAAAjB,EAAA,EAAA,GAAlDgB,MAAK1B,KAAM2B,GAAuC;AAAA,IAAC;AAErD,QAAI7C,cAAY;AAAA,UAAA6C;AAAAjB,gBAAA5B,gBACH6C,MAAAhD,kBAAkB;AAAA,QAAAG;AAAAA,MAAAA,CAAc,GAAC4B,QAAA5B,cAAA4B,QAAAiB,OAAAA,MAAAjB,EAAA,EAAA,GAA5CgB,MAAK1B,KAAM2B,GAAiC;AAAA,IAAC;AAE/C,QAAIzF,sBAAoB;AAAA,UAAAyF;AAAAjB,gBAAAxE,wBACXyF,MAAA5C,yBAAyB;AAAA,QAAA7C;AAAAA,MAAAA,CAAsB,GAACwE,QAAAxE,sBAAAwE,QAAAiB,OAAAA,MAAAjB,EAAA,EAAA,GAA3DgB,MAAK1B,KAAM2B,GAAgD;AAAA,IAAC;AAE9D,QAAI/B,YAAU;AAAA,UAAA+B;AAAAjB,gBAAAd,cACD+B,MAAA1C,uBAAuB;AAAA,QAAAW;AAAAA,MAAAA,CAAY,GAACc,QAAAd,YAAAc,QAAAiB,OAAAA,MAAAjB,EAAA,EAAA,GAA/CgB,MAAK1B,KAAM2B,GAAoC;AAAA,IAAC;AAElD,QAAIvB,aAAW;AAAA,UAAAuB;AAAAjB,gBAAAN,eACFuB,MAAAxB,sBAAsB;AAAA,QAAAC;AAAAA,MAAAA,CAAa,GAACM,QAAAN,aAAAM,QAAAiB,OAAAA,MAAAjB,EAAA,EAAA,GAA/CgB,MAAK1B,KAAM2B,GAAoC;AAAA,IAAC;AAElD,QAAIpB,eAAa;AAAA,UAAAoB;AAAAjB,gBAAAH,iBACJoB,MAAArB,wBAAwB;AAAA,QAAAC;AAAAA,MAAAA,CAAe,GAACG,QAAAH,eAAAG,QAAAiB,OAAAA,MAAAjB,EAAA,EAAA,GAAnDgB,MAAK1B,KAAM2B,GAAwC;AAAA,IAAC;AACrDjB,WAAApC,iBAAAoC,OAAA5B,cAAA4B,OAAAxE,sBAAAwE,OAAAd,YAAAc,OAAAN,aAAAM,OAAAH,eAAAG,QAAAgB;AAAAA,EAAA;AAAAA,YAAAhB,EAAA,EAAA;AAnBH,QAAAkB,aAoBSF,MAAK7C,SAAU,IAAf6C,QAAA;AAQP,MAAAC;AAAAjB,YAAAE,iBAIGe,KAAAf,gBAAA,qBAAA,UAAA,EAEG,UAAA;AAAA,IAAA,oBAAC,8BAAA,EACYA,WAAAA,eACL,MAAA;AAAA,MAAAiB,MAAO;AAAA,MAAGC,QAAU;AAAA,IAAA,GAAE;AAAA,IAE9B,oBAAC,8BAAA,EACYlB,WAAAA,eACL,MAAA;AAAA,MAAAiB,MAAO;AAAA,MAAGC,QAAU;AAAA,IAAA,EAAC,CAAC;AAAA,EAAA,EAAA,CAC5B,IATL,MAWOpB,QAAAE,eAAAF,QAAAiB,MAAAA,KAAAjB,EAAA,EAAA;AAAA,MAAAqB;AAAArB,YAAAG,iBACPkB,KAAAlB,gBACC,oBAAC,8BAAA,EACYA,WAAAA,eACL,MAAA;AAAA,IAAAgB,MAAO;AAAA,IAAGC,QAAU;AAAA,EAAA,EAAC,CAAC,IAH/B,MAKOpB,QAAAG,eAAAH,QAAAqB,MAAAA,KAAArB,EAAA,EAAA;AAAA,MAAAsB;AAAAtB,YAAAI,mBACPkB,KAAAlB,kBAAA,qBAAA,UAAA,EAEG,UAAA;AAAA,IAAA,oBAAC,8BAAA,EACYA,WAAAA,iBACL,MAAA;AAAA,MAAAe,MAAO;AAAA,MAAGC,QAAU;AAAA,IAAA,GAAE;AAAA,IAE9B,oBAAC,8BAAA,EACYhB,WAAAA,iBACL,MAAA;AAAA,MAAAe,MAAO;AAAA,MAAGC,QAAU;AAAA,IAAA,EAAC,CAAC;AAAA,EAAA,EAAA,CAC5B,IATL,MAWOpB,QAAAI,iBAAAJ,QAAAsB,MAAAA,KAAAtB,EAAA,EAAA;AAAA,MAAAuB;AAAAvB,YAAAK,0BACPkB,KAAAlB,yBACC,oBAAC,8BAAA,EACYA,WAAAA,wBACL,MAAA;AAAA,IAAAc,MAAO;AAAA,IAAGC,QAAU;AAAA,EAAA,EAAC,CAAC,IAH/B,MAKOpB,QAAAK,wBAAAL,QAAAuB,MAAAA,KAAAvB,EAAA,EAAA;AAAA,MAAAwB;AAAAxB,YAAAkB,cACPM,KAAAN,aAAa,oBAAC,iBAAA,EAAuBA,OAAAA,WAAAA,CAAU,IAA/C,MAA0DlB,QAAAkB,YAAAlB,QAAAwB,MAAAA,KAAAxB,EAAA,EAAA;AAAA,MAAAyB;AAAA,SAAAzB,EAAA,EAAA,MAAAiB,MAAAjB,EAAA,EAAA,MAAAqB,MAAArB,EAAA,EAAA,MAAAsB,MAAAtB,EAAA,EAAA,MAAAuB,MAAAvB,UAAAwB,MArC7DC,sCACGR,UAAAA;AAAAA,IAAAA;AAAAA,IAYAI;AAAAA,IAMAC;AAAAA,IAYAC;AAAAA,IAMAC;AAAAA,EAAAA,EAAAA,CAA0D,GAC1DxB,QAAAiB,IAAAjB,QAAAqB,IAAArB,QAAAsB,IAAAtB,QAAAuB,IAAAvB,QAAAwB,IAAAxB,QAAAyB,MAAAA,KAAAzB,EAAA,EAAA,GAtCHyB;AAsCG;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/behavior.markdown-shortcuts.ts","../src/rule.blockquote.ts","../src/rule.heading.ts","../src/rule.horizontal-rule.ts","../src/rule.markdown-link.ts","../src/rule.ordered-list.ts","../src/rule.unordered-list.ts","../src/plugin.markdown-shortcuts.tsx"],"sourcesContent":["import type {EditorContext} from '@portabletext/editor'\nimport {defineBehavior, raise} from '@portabletext/editor/behaviors'\nimport * as selectors from '@portabletext/editor/selectors'\n\nexport type ObjectWithOptionalKey = {\n _type: string\n _key?: string\n [other: string]: unknown\n}\n\nexport type MarkdownBehaviorsConfig = {\n horizontalRuleObject?: ({\n context,\n }: {\n context: Pick<EditorContext, 'schema' | 'keyGenerator'>\n }) => ObjectWithOptionalKey | undefined\n defaultStyle?: ({\n context,\n }: {\n context: Pick<EditorContext, 'schema'>\n }) => string | undefined\n}\n\nexport function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {\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 context: {\n schema: snapshot.context.schema,\n keyGenerator: snapshot.context.keyGenerator,\n },\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 raise({\n type: 'insert.text',\n text: hrCharacters,\n }),\n ],\n ({snapshot}, {hrObject, focusBlock, focusTextBlock}) =>\n focusTextBlock\n ? [\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n children: focusTextBlock.node.children,\n },\n placement: 'after',\n }),\n raise({\n type: 'insert.block',\n block: hrObject,\n placement: 'after',\n }),\n raise({\n type: 'delete.block',\n at: focusBlock.path,\n }),\n ]\n : [\n raise({\n type: 'insert.block',\n block: hrObject,\n placement: 'after',\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 context: {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 raise({\n type: 'block.set',\n props: {style: defaultStyle},\n at: focusTextBlock.path,\n }),\n ],\n ],\n })\n\n const markdownBehaviors = [automaticHrOnPaste, clearStyleOnBackspace]\n\n return markdownBehaviors\n}\n","import type {EditorContext} 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 createBlockquoteRule(config: {\n blockquoteStyle: ({\n context,\n }: {\n context: Pick<EditorContext, 'schema'>\n }) => string | undefined\n}) {\n return defineInputRule({\n on: /^> /,\n guard: ({snapshot, event}) => {\n const style = config.blockquoteStyle({\n context: {schema: snapshot.context.schema},\n })\n\n if (!style) {\n return false\n }\n\n const previousInlineObject = getPreviousInlineObject(snapshot)\n\n if (previousInlineObject) {\n return false\n }\n\n const match = event.matches.at(0)\n\n if (!match) {\n return false\n }\n\n return {style, match}\n },\n actions: [\n ({event}, {style, match}) => [\n raise({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: event.focusTextBlock.path,\n }),\n raise({\n type: 'block.set',\n props: {style},\n at: event.focusTextBlock.path,\n }),\n raise({\n type: 'delete',\n at: match.targetOffsets,\n }),\n ],\n ],\n })\n}\n","import type {EditorContext} 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 createHeadingRule(config: {\n headingStyle: ({\n context,\n props,\n }: {\n context: Pick<EditorContext, 'schema'>\n props: {level: number}\n }) => string | undefined\n}) {\n return defineInputRule({\n on: /^#+ /,\n guard: ({snapshot, event}) => {\n const previousInlineObject = getPreviousInlineObject(snapshot)\n\n if (previousInlineObject) {\n return false\n }\n\n const match = event.matches.at(0)\n\n if (!match) {\n return false\n }\n\n const level = match.text.length - 1\n\n const style = config.headingStyle({\n context: {schema: snapshot.context.schema},\n props: {level},\n })\n\n if (!style) {\n return false\n }\n\n return {match, style}\n },\n actions: [\n ({event}, {match, style}) => [\n raise({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: event.focusTextBlock.path,\n }),\n raise({\n type: 'block.set',\n props: {style},\n at: event.focusTextBlock.path,\n }),\n raise({\n type: 'delete',\n at: match.targetOffsets,\n }),\n ],\n ],\n })\n}\n","import type {EditorContext} from '@portabletext/editor'\nimport {raise} from '@portabletext/editor/behaviors'\nimport {getPreviousInlineObject} from '@portabletext/editor/selectors'\nimport {defineInputRule} from '@portabletext/plugin-input-rule'\nimport type {ObjectWithOptionalKey} from './behavior.markdown-shortcuts'\n\nexport function createHorizontalRuleRule(config: {\n horizontalRuleObject: ({\n context,\n }: {\n context: Pick<EditorContext, 'schema' | 'keyGenerator'>\n }) => ObjectWithOptionalKey | undefined\n}) {\n return defineInputRule({\n on: /^(---)|^(—-)|^(___)|^(\\*\\*\\*)/,\n guard: ({snapshot, event}) => {\n const hrObject = config.horizontalRuleObject({\n context: {\n schema: snapshot.context.schema,\n keyGenerator: snapshot.context.keyGenerator,\n },\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: hrObject,\n placement: 'before',\n select: 'none',\n }),\n raise({\n type: 'delete',\n at: match.targetOffsets,\n }),\n ],\n ],\n })\n}\n","import type {EditorContext} from '@portabletext/editor'\nimport {raise, type BehaviorAction} from '@portabletext/editor/behaviors'\nimport {defineInputRule} from '@portabletext/plugin-input-rule'\nimport type {ObjectWithOptionalKey} from './behavior.markdown-shortcuts'\n\nexport function createMarkdownLinkRule(config: {\n linkObject: ({\n context,\n props,\n }: {\n context: Pick<EditorContext, 'schema' | 'keyGenerator'>\n props: {href: string}\n }) => ObjectWithOptionalKey | undefined\n}) {\n return defineInputRule({\n on: /\\[([^[\\]]+)]\\((.+)\\)/,\n actions: [\n ({snapshot, event}) => {\n const newText = event.textBefore + event.textInserted\n let textLengthDelta = 0\n const actions: Array<BehaviorAction> = []\n\n for (const match of event.matches.reverse()) {\n const textMatch = match.groupMatches.at(0)\n const hrefMatch = match.groupMatches.at(1)\n\n if (textMatch === undefined || hrefMatch === undefined) {\n continue\n }\n\n textLengthDelta =\n textLengthDelta -\n (match.targetOffsets.focus.offset -\n match.targetOffsets.anchor.offset -\n textMatch.text.length)\n\n const linkObject = config.linkObject({\n context: {\n schema: snapshot.context.schema,\n keyGenerator: snapshot.context.keyGenerator,\n },\n props: {href: hrefMatch.text},\n })\n\n if (!linkObject) {\n continue\n }\n\n const {_type, _key, ...value} = linkObject\n\n const leftSideOffsets = {\n anchor: match.targetOffsets.anchor,\n focus: textMatch.targetOffsets.anchor,\n }\n const rightSideOffsets = {\n anchor: textMatch.targetOffsets.focus,\n focus: match.targetOffsets.focus,\n }\n\n actions.push(\n raise({\n type: 'select',\n at: textMatch.targetOffsets,\n }),\n )\n actions.push(\n raise({\n type: 'annotation.add',\n annotation: {\n name: _type,\n _key,\n value,\n },\n }),\n )\n actions.push(\n raise({\n type: 'delete',\n at: rightSideOffsets,\n }),\n )\n actions.push(\n raise({\n type: 'delete',\n at: leftSideOffsets,\n }),\n )\n }\n\n const endCaretPosition = {\n path: event.focusTextBlock.path,\n offset: newText.length - textLengthDelta * -1,\n }\n\n return [\n ...actions,\n raise({\n type: 'select',\n at: {\n anchor: endCaretPosition,\n focus: endCaretPosition,\n },\n }),\n ]\n },\n ],\n })\n}\n","import type {EditorContext} 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 createOrderedListRule(config: {\n orderedList: ({\n context,\n }: {\n context: Pick<EditorContext, 'schema'>\n }) => string | undefined\n}) {\n return defineInputRule({\n on: /^1\\. /,\n guard: ({snapshot, event}) => {\n const orderedList = config.orderedList({\n context: {schema: snapshot.context.schema},\n })\n\n if (!orderedList) {\n return false\n }\n\n const previousInlineObject = getPreviousInlineObject(snapshot)\n\n if (previousInlineObject) {\n return false\n }\n\n const match = event.matches.at(0)\n\n if (!match) {\n return false\n }\n\n return {match, orderedList}\n },\n actions: [\n ({event}, {match, orderedList}) => [\n raise({\n type: 'block.unset',\n props: ['style'],\n at: event.focusTextBlock.path,\n }),\n raise({\n type: 'block.set',\n props: {\n listItem: orderedList,\n level: event.focusTextBlock.node.level ?? 1,\n },\n at: event.focusTextBlock.path,\n }),\n raise({\n type: 'delete',\n at: match.targetOffsets,\n }),\n ],\n ],\n })\n}\n","import type {EditorContext} 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 createUnorderedListRule(config: {\n unorderedList: ({\n context,\n }: {\n context: Pick<EditorContext, 'schema'>\n }) => string | undefined\n}) {\n return defineInputRule({\n on: /^(-|\\*) /,\n guard: ({snapshot, event}) => {\n const unorderedList = config.unorderedList({\n context: {schema: snapshot.context.schema},\n })\n\n if (!unorderedList) {\n return false\n }\n\n const previousInlineObject = getPreviousInlineObject(snapshot)\n\n if (previousInlineObject) {\n return false\n }\n\n const match = event.matches.at(0)\n\n if (!match) {\n return false\n }\n\n return {match, unorderedList}\n },\n actions: [\n ({event}, {match, unorderedList}) => [\n raise({\n type: 'block.unset',\n props: ['style'],\n at: event.focusTextBlock.path,\n }),\n raise({\n type: 'block.set',\n props: {\n listItem: unorderedList,\n level: event.focusTextBlock.node.level ?? 1,\n },\n at: event.focusTextBlock.path,\n }),\n raise({\n type: 'delete',\n at: match.targetOffsets,\n }),\n ],\n ],\n })\n}\n","import type {EditorContext} from '@portabletext/editor'\nimport {useEditor} from '@portabletext/editor'\nimport {CharacterPairDecoratorPlugin} from '@portabletext/plugin-character-pair-decorator'\nimport {InputRulePlugin} from '@portabletext/plugin-input-rule'\nimport {useEffect, useMemo} from 'react'\nimport {\n createMarkdownBehaviors,\n type MarkdownBehaviorsConfig,\n type ObjectWithOptionalKey,\n} from './behavior.markdown-shortcuts'\nimport {createBlockquoteRule} from './rule.blockquote'\nimport {createHeadingRule} from './rule.heading'\nimport {createHorizontalRuleRule} from './rule.horizontal-rule'\nimport {createMarkdownLinkRule} from './rule.markdown-link'\nimport {createOrderedListRule} from './rule.ordered-list'\nimport {createUnorderedListRule} from './rule.unordered-list'\n\n/**\n * @public\n */\nexport type MarkdownShortcutsPluginProps = MarkdownBehaviorsConfig & {\n blockquoteStyle?: ({\n context,\n }: {\n context: Pick<EditorContext, 'schema'>\n }) => string | undefined\n defaultStyle?: ({\n context,\n }: {\n context: Pick<EditorContext, 'schema'>\n }) => string | undefined\n headingStyle?: ({\n context,\n props,\n }: {\n context: Pick<EditorContext, 'schema'>\n props: {level: number}\n }) => string | undefined\n linkObject?: ({\n context,\n props,\n }: {\n context: Pick<EditorContext, 'schema' | 'keyGenerator'>\n props: {href: string}\n }) => ObjectWithOptionalKey | undefined\n unorderedList?: ({\n context,\n }: {\n context: Pick<EditorContext, 'schema'>\n }) => string | undefined\n orderedList?: ({\n context,\n }: {\n context: Pick<EditorContext, 'schema'>\n }) => string | undefined\n boldDecorator?: ({\n context,\n }: {\n context: Pick<EditorContext, 'schema'>\n }) => string | undefined\n codeDecorator?: ({\n context,\n }: {\n context: Pick<EditorContext, 'schema'>\n }) => string | undefined\n italicDecorator?: ({\n context,\n }: {\n context: Pick<EditorContext, 'schema'>\n }) => string | undefined\n strikeThroughDecorator?: ({\n context,\n }: {\n context: Pick<EditorContext, 'schema'>\n }) => string | undefined\n}\n\n/**\n * @public\n */\nexport function MarkdownShortcutsPlugin({\n blockquoteStyle,\n boldDecorator,\n codeDecorator,\n defaultStyle,\n headingStyle,\n horizontalRuleObject,\n linkObject,\n italicDecorator,\n orderedList,\n strikeThroughDecorator,\n unorderedList,\n}: MarkdownShortcutsPluginProps) {\n const editor = useEditor()\n\n useEffect(() => {\n const behaviors = createMarkdownBehaviors({\n defaultStyle,\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 }, [defaultStyle, editor])\n\n const inputRules = useMemo(() => {\n const rules = []\n if (blockquoteStyle) {\n rules.push(createBlockquoteRule({blockquoteStyle}))\n }\n if (headingStyle) {\n rules.push(createHeadingRule({headingStyle}))\n }\n if (horizontalRuleObject) {\n rules.push(createHorizontalRuleRule({horizontalRuleObject}))\n }\n if (linkObject) {\n rules.push(createMarkdownLinkRule({linkObject}))\n }\n if (orderedList) {\n rules.push(createOrderedListRule({orderedList}))\n }\n if (unorderedList) {\n rules.push(createUnorderedListRule({unorderedList}))\n }\n return rules.length > 0 ? rules : null\n }, [\n blockquoteStyle,\n headingStyle,\n horizontalRuleObject,\n linkObject,\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 {inputRules ? <InputRulePlugin rules={inputRules} /> : null}\n </>\n )\n}\n"],"names":["createMarkdownBehaviors","config","automaticHrOnPaste","defineBehavior","on","guard","snapshot","event","text","originEvent","dataTransfer","getData","hrRegExp","hrCharacters","match","hrObject","horizontalRuleObject","context","schema","keyGenerator","focusBlock","selectors","getFocusBlock","focusTextBlock","getFocusTextBlock","actions","_","raise","type","block","_type","name","children","node","placement","at","path","clearStyleOnBackspace","selectionCollapsed","isSelectionCollapsed","focusSpan","getFocusSpan","atTheBeginningOfBLock","_key","selection","focus","offset","defaultStyle","style","props","createBlockquoteRule","defineInputRule","blockquoteStyle","getPreviousInlineObject","matches","targetOffsets","createHeadingRule","level","length","headingStyle","createHorizontalRuleRule","select","createMarkdownLinkRule","newText","textBefore","textInserted","textLengthDelta","reverse","textMatch","groupMatches","hrefMatch","undefined","anchor","linkObject","href","value","leftSideOffsets","rightSideOffsets","push","annotation","endCaretPosition","createOrderedListRule","orderedList","listItem","createUnorderedListRule","unorderedList","MarkdownShortcutsPlugin","t0","$","_c","boldDecorator","codeDecorator","italicDecorator","strikeThroughDecorator","editor","useEditor","t1","t2","unregisterBehaviors","map","behavior","registerBehavior","unregisterBehavior","useEffect","rules","t3","inputRules","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": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "Adds helpful Markdown shortcuts to the editor",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"portabletext",
|
|
@@ -36,27 +36,27 @@
|
|
|
36
36
|
"dist"
|
|
37
37
|
],
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@portabletext/plugin-character-pair-decorator": "^
|
|
40
|
-
"@portabletext/plugin-input-rule": "~0.5.
|
|
39
|
+
"@portabletext/plugin-character-pair-decorator": "^3.0.0",
|
|
40
|
+
"@portabletext/plugin-input-rule": "~0.5.2"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"@types/react": "^19.
|
|
43
|
+
"@types/react": "^19.2.2",
|
|
44
44
|
"@vitejs/plugin-react": "^5.0.4",
|
|
45
|
-
"@vitest/browser": "^4.0.
|
|
46
|
-
"@vitest/browser-playwright": "^4.0.
|
|
45
|
+
"@vitest/browser": "^4.0.6",
|
|
46
|
+
"@vitest/browser-playwright": "^4.0.6",
|
|
47
47
|
"babel-plugin-react-compiler": "1.0.0",
|
|
48
48
|
"eslint": "^9.38.0",
|
|
49
49
|
"eslint-plugin-react-hooks": "7.0.1",
|
|
50
|
-
"react": "^19.
|
|
50
|
+
"react": "^19.2.0",
|
|
51
51
|
"typescript": "5.9.3",
|
|
52
52
|
"typescript-eslint": "^8.46.1",
|
|
53
|
-
"vitest": "^4.0.
|
|
54
|
-
"@portabletext/editor": "^2.
|
|
53
|
+
"vitest": "^4.0.6",
|
|
54
|
+
"@portabletext/editor": "^2.19.0",
|
|
55
55
|
"racejar": "2.0.0"
|
|
56
56
|
},
|
|
57
57
|
"peerDependencies": {
|
|
58
58
|
"react": "^19",
|
|
59
|
-
"@portabletext/editor": "^2.
|
|
59
|
+
"@portabletext/editor": "^2.19.0"
|
|
60
60
|
},
|
|
61
61
|
"engines": {
|
|
62
62
|
"node": ">=20.19 <22 || >=22.12"
|
|
@@ -1,12 +1,24 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import {defineBehavior,
|
|
1
|
+
import type {EditorContext} from '@portabletext/editor'
|
|
2
|
+
import {defineBehavior, raise} from '@portabletext/editor/behaviors'
|
|
3
3
|
import * as selectors from '@portabletext/editor/selectors'
|
|
4
4
|
|
|
5
|
+
export type ObjectWithOptionalKey = {
|
|
6
|
+
_type: string
|
|
7
|
+
_key?: string
|
|
8
|
+
[other: string]: unknown
|
|
9
|
+
}
|
|
10
|
+
|
|
5
11
|
export type MarkdownBehaviorsConfig = {
|
|
6
|
-
horizontalRuleObject?: (
|
|
7
|
-
|
|
8
|
-
}
|
|
9
|
-
|
|
12
|
+
horizontalRuleObject?: ({
|
|
13
|
+
context,
|
|
14
|
+
}: {
|
|
15
|
+
context: Pick<EditorContext, 'schema' | 'keyGenerator'>
|
|
16
|
+
}) => ObjectWithOptionalKey | undefined
|
|
17
|
+
defaultStyle?: ({
|
|
18
|
+
context,
|
|
19
|
+
}: {
|
|
20
|
+
context: Pick<EditorContext, 'schema'>
|
|
21
|
+
}) => string | undefined
|
|
10
22
|
}
|
|
11
23
|
|
|
12
24
|
export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
|
|
@@ -17,7 +29,10 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
|
|
|
17
29
|
const hrRegExp = /^(---)$|^(—-)$|^(___)$|^(\*\*\*)$/
|
|
18
30
|
const hrCharacters = text.match(hrRegExp)?.[0]
|
|
19
31
|
const hrObject = config.horizontalRuleObject?.({
|
|
20
|
-
|
|
32
|
+
context: {
|
|
33
|
+
schema: snapshot.context.schema,
|
|
34
|
+
keyGenerator: snapshot.context.keyGenerator,
|
|
35
|
+
},
|
|
21
36
|
})
|
|
22
37
|
const focusBlock = selectors.getFocusBlock(snapshot)
|
|
23
38
|
const focusTextBlock = selectors.getFocusTextBlock(snapshot)
|
|
@@ -30,7 +45,7 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
|
|
|
30
45
|
},
|
|
31
46
|
actions: [
|
|
32
47
|
(_, {hrCharacters}) => [
|
|
33
|
-
|
|
48
|
+
raise({
|
|
34
49
|
type: 'insert.text',
|
|
35
50
|
text: hrCharacters,
|
|
36
51
|
}),
|
|
@@ -38,7 +53,7 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
|
|
|
38
53
|
({snapshot}, {hrObject, focusBlock, focusTextBlock}) =>
|
|
39
54
|
focusTextBlock
|
|
40
55
|
? [
|
|
41
|
-
|
|
56
|
+
raise({
|
|
42
57
|
type: 'insert.block',
|
|
43
58
|
block: {
|
|
44
59
|
_type: snapshot.context.schema.block.name,
|
|
@@ -46,26 +61,20 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
|
|
|
46
61
|
},
|
|
47
62
|
placement: 'after',
|
|
48
63
|
}),
|
|
49
|
-
|
|
64
|
+
raise({
|
|
50
65
|
type: 'insert.block',
|
|
51
|
-
block:
|
|
52
|
-
_type: hrObject.name,
|
|
53
|
-
...(hrObject.value ?? {}),
|
|
54
|
-
},
|
|
66
|
+
block: hrObject,
|
|
55
67
|
placement: 'after',
|
|
56
68
|
}),
|
|
57
|
-
|
|
69
|
+
raise({
|
|
58
70
|
type: 'delete.block',
|
|
59
71
|
at: focusBlock.path,
|
|
60
72
|
}),
|
|
61
73
|
]
|
|
62
74
|
: [
|
|
63
|
-
|
|
75
|
+
raise({
|
|
64
76
|
type: 'insert.block',
|
|
65
|
-
block:
|
|
66
|
-
_type: hrObject.name,
|
|
67
|
-
...(hrObject.value ?? {}),
|
|
68
|
-
},
|
|
77
|
+
block: hrObject,
|
|
69
78
|
placement: 'after',
|
|
70
79
|
}),
|
|
71
80
|
],
|
|
@@ -88,7 +97,7 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
|
|
|
88
97
|
snapshot.context.selection?.focus.offset === 0
|
|
89
98
|
|
|
90
99
|
const defaultStyle = config.defaultStyle?.({
|
|
91
|
-
schema: snapshot.context.schema,
|
|
100
|
+
context: {schema: snapshot.context.schema},
|
|
92
101
|
})
|
|
93
102
|
|
|
94
103
|
if (
|
|
@@ -103,7 +112,7 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
|
|
|
103
112
|
},
|
|
104
113
|
actions: [
|
|
105
114
|
(_, {defaultStyle, focusTextBlock}) => [
|
|
106
|
-
|
|
115
|
+
raise({
|
|
107
116
|
type: 'block.set',
|
|
108
117
|
props: {style: defaultStyle},
|
|
109
118
|
at: focusTextBlock.path,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type {EditorContext} from '@portabletext/editor'
|
|
2
2
|
import {useEditor} from '@portabletext/editor'
|
|
3
3
|
import {CharacterPairDecoratorPlugin} from '@portabletext/plugin-character-pair-decorator'
|
|
4
4
|
import {InputRulePlugin} from '@portabletext/plugin-input-rule'
|
|
@@ -6,6 +6,7 @@ import {useEffect, useMemo} from 'react'
|
|
|
6
6
|
import {
|
|
7
7
|
createMarkdownBehaviors,
|
|
8
8
|
type MarkdownBehaviorsConfig,
|
|
9
|
+
type ObjectWithOptionalKey,
|
|
9
10
|
} from './behavior.markdown-shortcuts'
|
|
10
11
|
import {createBlockquoteRule} from './rule.blockquote'
|
|
11
12
|
import {createHeadingRule} from './rule.heading'
|
|
@@ -15,33 +16,67 @@ import {createOrderedListRule} from './rule.ordered-list'
|
|
|
15
16
|
import {createUnorderedListRule} from './rule.unordered-list'
|
|
16
17
|
|
|
17
18
|
/**
|
|
18
|
-
* @
|
|
19
|
+
* @public
|
|
19
20
|
*/
|
|
20
21
|
export type MarkdownShortcutsPluginProps = MarkdownBehaviorsConfig & {
|
|
21
|
-
blockquoteStyle?: (
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
blockquoteStyle?: ({
|
|
23
|
+
context,
|
|
24
|
+
}: {
|
|
25
|
+
context: Pick<EditorContext, 'schema'>
|
|
26
|
+
}) => string | undefined
|
|
27
|
+
defaultStyle?: ({
|
|
28
|
+
context,
|
|
29
|
+
}: {
|
|
30
|
+
context: Pick<EditorContext, 'schema'>
|
|
31
|
+
}) => string | undefined
|
|
32
|
+
headingStyle?: ({
|
|
33
|
+
context,
|
|
34
|
+
props,
|
|
35
|
+
}: {
|
|
36
|
+
context: Pick<EditorContext, 'schema'>
|
|
37
|
+
props: {level: number}
|
|
38
|
+
}) => string | undefined
|
|
39
|
+
linkObject?: ({
|
|
40
|
+
context,
|
|
41
|
+
props,
|
|
42
|
+
}: {
|
|
43
|
+
context: Pick<EditorContext, 'schema' | 'keyGenerator'>
|
|
44
|
+
props: {href: string}
|
|
45
|
+
}) => ObjectWithOptionalKey | undefined
|
|
46
|
+
unorderedList?: ({
|
|
47
|
+
context,
|
|
48
|
+
}: {
|
|
49
|
+
context: Pick<EditorContext, 'schema'>
|
|
50
|
+
}) => string | undefined
|
|
51
|
+
orderedList?: ({
|
|
52
|
+
context,
|
|
53
|
+
}: {
|
|
54
|
+
context: Pick<EditorContext, 'schema'>
|
|
55
|
+
}) => string | undefined
|
|
56
|
+
boldDecorator?: ({
|
|
57
|
+
context,
|
|
58
|
+
}: {
|
|
59
|
+
context: Pick<EditorContext, 'schema'>
|
|
60
|
+
}) => string | undefined
|
|
61
|
+
codeDecorator?: ({
|
|
62
|
+
context,
|
|
63
|
+
}: {
|
|
64
|
+
context: Pick<EditorContext, 'schema'>
|
|
65
|
+
}) => string | undefined
|
|
66
|
+
italicDecorator?: ({
|
|
67
|
+
context,
|
|
68
|
+
}: {
|
|
69
|
+
context: Pick<EditorContext, 'schema'>
|
|
26
70
|
}) => string | undefined
|
|
27
|
-
linkObject?: (context: {
|
|
28
|
-
schema: EditorSchema
|
|
29
|
-
href: string
|
|
30
|
-
}) => {name: string; value?: {[prop: string]: unknown}} | undefined
|
|
31
|
-
unorderedList?: (context: {schema: EditorSchema}) => string | undefined
|
|
32
|
-
orderedList?: (context: {schema: EditorSchema}) => string | undefined
|
|
33
|
-
boldDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined
|
|
34
|
-
codeDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined
|
|
35
|
-
italicDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined
|
|
36
71
|
strikeThroughDecorator?: ({
|
|
37
|
-
|
|
72
|
+
context,
|
|
38
73
|
}: {
|
|
39
|
-
|
|
74
|
+
context: Pick<EditorContext, 'schema'>
|
|
40
75
|
}) => string | undefined
|
|
41
76
|
}
|
|
42
77
|
|
|
43
78
|
/**
|
|
44
|
-
* @
|
|
79
|
+
* @public
|
|
45
80
|
*/
|
|
46
81
|
export function MarkdownShortcutsPlugin({
|
|
47
82
|
blockquoteStyle,
|
package/src/rule.blockquote.ts
CHANGED
|
@@ -1,16 +1,20 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type {EditorContext} from '@portabletext/editor'
|
|
2
2
|
import {raise} from '@portabletext/editor/behaviors'
|
|
3
3
|
import {getPreviousInlineObject} from '@portabletext/editor/selectors'
|
|
4
4
|
import {defineInputRule} from '@portabletext/plugin-input-rule'
|
|
5
5
|
|
|
6
6
|
export function createBlockquoteRule(config: {
|
|
7
|
-
blockquoteStyle: (
|
|
7
|
+
blockquoteStyle: ({
|
|
8
|
+
context,
|
|
9
|
+
}: {
|
|
10
|
+
context: Pick<EditorContext, 'schema'>
|
|
11
|
+
}) => string | undefined
|
|
8
12
|
}) {
|
|
9
13
|
return defineInputRule({
|
|
10
14
|
on: /^> /,
|
|
11
15
|
guard: ({snapshot, event}) => {
|
|
12
16
|
const style = config.blockquoteStyle({
|
|
13
|
-
schema: snapshot.context.schema,
|
|
17
|
+
context: {schema: snapshot.context.schema},
|
|
14
18
|
})
|
|
15
19
|
|
|
16
20
|
if (!style) {
|
package/src/rule.heading.ts
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type {EditorContext} from '@portabletext/editor'
|
|
2
2
|
import {raise} from '@portabletext/editor/behaviors'
|
|
3
3
|
import {getPreviousInlineObject} from '@portabletext/editor/selectors'
|
|
4
4
|
import {defineInputRule} from '@portabletext/plugin-input-rule'
|
|
5
5
|
|
|
6
6
|
export function createHeadingRule(config: {
|
|
7
|
-
headingStyle: (
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
headingStyle: ({
|
|
8
|
+
context,
|
|
9
|
+
props,
|
|
10
|
+
}: {
|
|
11
|
+
context: Pick<EditorContext, 'schema'>
|
|
12
|
+
props: {level: number}
|
|
10
13
|
}) => string | undefined
|
|
11
14
|
}) {
|
|
12
15
|
return defineInputRule({
|
|
@@ -27,8 +30,8 @@ export function createHeadingRule(config: {
|
|
|
27
30
|
const level = match.text.length - 1
|
|
28
31
|
|
|
29
32
|
const style = config.headingStyle({
|
|
30
|
-
schema: snapshot.context.schema,
|
|
31
|
-
level,
|
|
33
|
+
context: {schema: snapshot.context.schema},
|
|
34
|
+
props: {level},
|
|
32
35
|
})
|
|
33
36
|
|
|
34
37
|
if (!style) {
|
|
@@ -1,18 +1,24 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type {EditorContext} from '@portabletext/editor'
|
|
2
2
|
import {raise} from '@portabletext/editor/behaviors'
|
|
3
3
|
import {getPreviousInlineObject} from '@portabletext/editor/selectors'
|
|
4
4
|
import {defineInputRule} from '@portabletext/plugin-input-rule'
|
|
5
|
+
import type {ObjectWithOptionalKey} from './behavior.markdown-shortcuts'
|
|
5
6
|
|
|
6
7
|
export function createHorizontalRuleRule(config: {
|
|
7
|
-
horizontalRuleObject: (
|
|
8
|
-
|
|
9
|
-
}
|
|
8
|
+
horizontalRuleObject: ({
|
|
9
|
+
context,
|
|
10
|
+
}: {
|
|
11
|
+
context: Pick<EditorContext, 'schema' | 'keyGenerator'>
|
|
12
|
+
}) => ObjectWithOptionalKey | undefined
|
|
10
13
|
}) {
|
|
11
14
|
return defineInputRule({
|
|
12
15
|
on: /^(---)|^(—-)|^(___)|^(\*\*\*)/,
|
|
13
16
|
guard: ({snapshot, event}) => {
|
|
14
17
|
const hrObject = config.horizontalRuleObject({
|
|
15
|
-
|
|
18
|
+
context: {
|
|
19
|
+
schema: snapshot.context.schema,
|
|
20
|
+
keyGenerator: snapshot.context.keyGenerator,
|
|
21
|
+
},
|
|
16
22
|
})
|
|
17
23
|
|
|
18
24
|
if (!hrObject) {
|
|
@@ -44,10 +50,7 @@ export function createHorizontalRuleRule(config: {
|
|
|
44
50
|
(_, {hrObject, match}) => [
|
|
45
51
|
raise({
|
|
46
52
|
type: 'insert.block',
|
|
47
|
-
block:
|
|
48
|
-
_type: hrObject.name,
|
|
49
|
-
...(hrObject.value ?? {}),
|
|
50
|
-
},
|
|
53
|
+
block: hrObject,
|
|
51
54
|
placement: 'before',
|
|
52
55
|
select: 'none',
|
|
53
56
|
}),
|
|
@@ -12,11 +12,9 @@ import {createMarkdownLinkRule} from './rule.markdown-link'
|
|
|
12
12
|
import markdownLinkFeature from './rule.markdown-link.feature?raw'
|
|
13
13
|
|
|
14
14
|
const markdownLinkRule = createMarkdownLinkRule({
|
|
15
|
-
linkObject: (
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
href: context.href,
|
|
19
|
-
},
|
|
15
|
+
linkObject: ({props}) => ({
|
|
16
|
+
_type: 'link',
|
|
17
|
+
href: props.href,
|
|
20
18
|
}),
|
|
21
19
|
})
|
|
22
20
|
|
|
@@ -1,12 +1,16 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type {EditorContext} from '@portabletext/editor'
|
|
2
2
|
import {raise, type BehaviorAction} from '@portabletext/editor/behaviors'
|
|
3
3
|
import {defineInputRule} from '@portabletext/plugin-input-rule'
|
|
4
|
+
import type {ObjectWithOptionalKey} from './behavior.markdown-shortcuts'
|
|
4
5
|
|
|
5
6
|
export function createMarkdownLinkRule(config: {
|
|
6
|
-
linkObject: (
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}
|
|
7
|
+
linkObject: ({
|
|
8
|
+
context,
|
|
9
|
+
props,
|
|
10
|
+
}: {
|
|
11
|
+
context: Pick<EditorContext, 'schema' | 'keyGenerator'>
|
|
12
|
+
props: {href: string}
|
|
13
|
+
}) => ObjectWithOptionalKey | undefined
|
|
10
14
|
}) {
|
|
11
15
|
return defineInputRule({
|
|
12
16
|
on: /\[([^[\]]+)]\((.+)\)/,
|
|
@@ -31,14 +35,19 @@ export function createMarkdownLinkRule(config: {
|
|
|
31
35
|
textMatch.text.length)
|
|
32
36
|
|
|
33
37
|
const linkObject = config.linkObject({
|
|
34
|
-
|
|
35
|
-
|
|
38
|
+
context: {
|
|
39
|
+
schema: snapshot.context.schema,
|
|
40
|
+
keyGenerator: snapshot.context.keyGenerator,
|
|
41
|
+
},
|
|
42
|
+
props: {href: hrefMatch.text},
|
|
36
43
|
})
|
|
37
44
|
|
|
38
45
|
if (!linkObject) {
|
|
39
46
|
continue
|
|
40
47
|
}
|
|
41
48
|
|
|
49
|
+
const {_type, _key, ...value} = linkObject
|
|
50
|
+
|
|
42
51
|
const leftSideOffsets = {
|
|
43
52
|
anchor: match.targetOffsets.anchor,
|
|
44
53
|
focus: textMatch.targetOffsets.anchor,
|
|
@@ -58,8 +67,9 @@ export function createMarkdownLinkRule(config: {
|
|
|
58
67
|
raise({
|
|
59
68
|
type: 'annotation.add',
|
|
60
69
|
annotation: {
|
|
61
|
-
name:
|
|
62
|
-
|
|
70
|
+
name: _type,
|
|
71
|
+
_key,
|
|
72
|
+
value,
|
|
63
73
|
},
|
|
64
74
|
}),
|
|
65
75
|
)
|
package/src/rule.ordered-list.ts
CHANGED
|
@@ -1,16 +1,20 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type {EditorContext} from '@portabletext/editor'
|
|
2
2
|
import {raise} from '@portabletext/editor/behaviors'
|
|
3
3
|
import {getPreviousInlineObject} from '@portabletext/editor/selectors'
|
|
4
4
|
import {defineInputRule} from '@portabletext/plugin-input-rule'
|
|
5
5
|
|
|
6
6
|
export function createOrderedListRule(config: {
|
|
7
|
-
orderedList: (
|
|
7
|
+
orderedList: ({
|
|
8
|
+
context,
|
|
9
|
+
}: {
|
|
10
|
+
context: Pick<EditorContext, 'schema'>
|
|
11
|
+
}) => string | undefined
|
|
8
12
|
}) {
|
|
9
13
|
return defineInputRule({
|
|
10
14
|
on: /^1\. /,
|
|
11
15
|
guard: ({snapshot, event}) => {
|
|
12
16
|
const orderedList = config.orderedList({
|
|
13
|
-
schema: snapshot.context.schema,
|
|
17
|
+
context: {schema: snapshot.context.schema},
|
|
14
18
|
})
|
|
15
19
|
|
|
16
20
|
if (!orderedList) {
|
|
@@ -1,16 +1,20 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type {EditorContext} from '@portabletext/editor'
|
|
2
2
|
import {raise} from '@portabletext/editor/behaviors'
|
|
3
3
|
import {getPreviousInlineObject} from '@portabletext/editor/selectors'
|
|
4
4
|
import {defineInputRule} from '@portabletext/plugin-input-rule'
|
|
5
5
|
|
|
6
6
|
export function createUnorderedListRule(config: {
|
|
7
|
-
unorderedList: (
|
|
7
|
+
unorderedList: ({
|
|
8
|
+
context,
|
|
9
|
+
}: {
|
|
10
|
+
context: Pick<EditorContext, 'schema'>
|
|
11
|
+
}) => string | undefined
|
|
8
12
|
}) {
|
|
9
13
|
return defineInputRule({
|
|
10
14
|
on: /^(-|\*) /,
|
|
11
15
|
guard: ({snapshot, event}) => {
|
|
12
16
|
const unorderedList = config.unorderedList({
|
|
13
|
-
schema: snapshot.context.schema,
|
|
17
|
+
context: {schema: snapshot.context.schema},
|
|
14
18
|
})
|
|
15
19
|
|
|
16
20
|
if (!unorderedList) {
|