@portabletext/plugin-markdown-shortcuts 3.0.0 → 3.0.2

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.d.ts CHANGED
@@ -9,8 +9,13 @@ declare type MarkdownBehaviorsConfig = {
9
9
  }) => ObjectWithOptionalKey | undefined
10
10
  defaultStyle?: ({
11
11
  context,
12
+ schema,
12
13
  }: {
13
14
  context: Pick<EditorContext, 'schema'>
15
+ /**
16
+ * @deprecated Use `context.schema` instead
17
+ */
18
+ schema: EditorContext['schema']
14
19
  }) => string | undefined
15
20
  }
16
21
 
@@ -37,22 +42,42 @@ export declare function MarkdownShortcutsPlugin({
37
42
  export declare type MarkdownShortcutsPluginProps = MarkdownBehaviorsConfig & {
38
43
  blockquoteStyle?: ({
39
44
  context,
45
+ schema,
40
46
  }: {
41
47
  context: Pick<EditorContext, 'schema'>
48
+ /**
49
+ * @deprecated Use `context.schema` instead
50
+ */
51
+ schema: EditorContext['schema']
42
52
  }) => string | undefined
43
53
  defaultStyle?: ({
44
54
  context,
55
+ schema,
45
56
  }: {
46
57
  context: Pick<EditorContext, 'schema'>
58
+ /**
59
+ * @deprecated Use `context.schema` instead
60
+ */
61
+ schema: EditorContext['schema']
47
62
  }) => string | undefined
48
63
  headingStyle?: ({
49
64
  context,
65
+ schema,
50
66
  props,
67
+ level,
51
68
  }: {
52
69
  context: Pick<EditorContext, 'schema'>
70
+ /**
71
+ * @deprecated Use `context.schema` instead
72
+ */
73
+ schema: EditorContext['schema']
53
74
  props: {
54
75
  level: number
55
76
  }
77
+ /**
78
+ * @deprecated Use `props.level` instead
79
+ */
80
+ level: number
56
81
  }) => string | undefined
57
82
  linkObject?: ({
58
83
  context,
@@ -65,33 +90,63 @@ export declare type MarkdownShortcutsPluginProps = MarkdownBehaviorsConfig & {
65
90
  }) => ObjectWithOptionalKey | undefined
66
91
  unorderedList?: ({
67
92
  context,
93
+ schema,
68
94
  }: {
69
95
  context: Pick<EditorContext, 'schema'>
96
+ /**
97
+ * @deprecated Use `context.schema` instead
98
+ */
99
+ schema: EditorContext['schema']
70
100
  }) => string | undefined
71
101
  orderedList?: ({
72
102
  context,
103
+ schema,
73
104
  }: {
74
105
  context: Pick<EditorContext, 'schema'>
106
+ /**
107
+ * @deprecated Use `context.schema` instead
108
+ */
109
+ schema: EditorContext['schema']
75
110
  }) => string | undefined
76
111
  boldDecorator?: ({
77
112
  context,
113
+ schema,
78
114
  }: {
79
115
  context: Pick<EditorContext, 'schema'>
116
+ /**
117
+ * @deprecated Use `context.schema` instead
118
+ */
119
+ schema: EditorContext['schema']
80
120
  }) => string | undefined
81
121
  codeDecorator?: ({
82
122
  context,
123
+ schema,
83
124
  }: {
84
125
  context: Pick<EditorContext, 'schema'>
126
+ /**
127
+ * @deprecated Use `context.schema` instead
128
+ */
129
+ schema: EditorContext['schema']
85
130
  }) => string | undefined
86
131
  italicDecorator?: ({
87
132
  context,
133
+ schema,
88
134
  }: {
89
135
  context: Pick<EditorContext, 'schema'>
136
+ /**
137
+ * @deprecated Use `context.schema` instead
138
+ */
139
+ schema: EditorContext['schema']
90
140
  }) => string | undefined
91
141
  strikeThroughDecorator?: ({
92
142
  context,
143
+ schema,
93
144
  }: {
94
145
  context: Pick<EditorContext, 'schema'>
146
+ /**
147
+ * @deprecated Use `context.schema` instead
148
+ */
149
+ schema: EditorContext['schema']
95
150
  }) => string | undefined
96
151
  }
97
152
 
package/dist/index.js CHANGED
@@ -68,7 +68,8 @@ function createMarkdownBehaviors(config) {
68
68
  const atTheBeginningOfBLock = focusTextBlock.node.children[0]._key === focusSpan.node._key && snapshot.context.selection?.focus.offset === 0, defaultStyle = config.defaultStyle?.({
69
69
  context: {
70
70
  schema: snapshot.context.schema
71
- }
71
+ },
72
+ schema: snapshot.context.schema
72
73
  });
73
74
  return atTheBeginningOfBLock && defaultStyle && focusTextBlock.node.style !== defaultStyle ? {
74
75
  defaultStyle,
@@ -98,7 +99,8 @@ function createBlockquoteRule(config) {
98
99
  const style = config.blockquoteStyle({
99
100
  context: {
100
101
  schema: snapshot.context.schema
101
- }
102
+ },
103
+ schema: snapshot.context.schema
102
104
  });
103
105
  if (!style || getPreviousInlineObject(snapshot))
104
106
  return !1;
@@ -145,9 +147,11 @@ function createHeadingRule(config) {
145
147
  context: {
146
148
  schema: snapshot.context.schema
147
149
  },
150
+ schema: snapshot.context.schema,
148
151
  props: {
149
152
  level
150
- }
153
+ },
154
+ level
151
155
  });
152
156
  return style ? {
153
157
  match,
@@ -289,7 +293,8 @@ function createOrderedListRule(config) {
289
293
  const orderedList = config.orderedList({
290
294
  context: {
291
295
  schema: snapshot.context.schema
292
- }
296
+ },
297
+ schema: snapshot.context.schema
293
298
  });
294
299
  if (!orderedList || getPreviousInlineObject(snapshot))
295
300
  return !1;
@@ -331,7 +336,8 @@ function createUnorderedListRule(config) {
331
336
  const unorderedList = config.unorderedList({
332
337
  context: {
333
338
  schema: snapshot.context.schema
334
- }
339
+ },
340
+ schema: snapshot.context.schema
335
341
  });
336
342
  if (!unorderedList || getPreviousInlineObject(snapshot))
337
343
  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 {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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"}
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 schema,\n }: {\n context: Pick<EditorContext, 'schema'>\n /**\n * @deprecated Use `context.schema` instead\n */\n schema: 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 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 schema,\n }: {\n context: Pick<EditorContext, 'schema'>\n /**\n * @deprecated Use `context.schema` instead\n */\n schema: 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 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 schema,\n props,\n level,\n }: {\n context: Pick<EditorContext, 'schema'>\n /**\n * @deprecated Use `context.schema` instead\n */\n schema: EditorContext['schema']\n props: {level: number}\n /**\n * @deprecated Use `props.level` instead\n */\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 context: {schema: snapshot.context.schema},\n schema: snapshot.context.schema,\n props: {level},\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 {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 schema,\n }: {\n context: Pick<EditorContext, 'schema'>\n /**\n * @deprecated Use `context.schema` instead\n */\n schema: 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 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 schema,\n }: {\n context: Pick<EditorContext, 'schema'>\n /**\n * @deprecated Use `context.schema` instead\n */\n schema: 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 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 schema,\n }: {\n context: Pick<EditorContext, 'schema'>\n /**\n * @deprecated Use `context.schema` instead\n */\n schema: EditorContext['schema']\n }) => string | undefined\n defaultStyle?: ({\n context,\n schema,\n }: {\n context: Pick<EditorContext, 'schema'>\n /**\n * @deprecated Use `context.schema` instead\n */\n schema: EditorContext['schema']\n }) => string | undefined\n headingStyle?: ({\n context,\n schema,\n props,\n level,\n }: {\n context: Pick<EditorContext, 'schema'>\n /**\n * @deprecated Use `context.schema` instead\n */\n schema: EditorContext['schema']\n props: {level: number}\n /**\n * @deprecated Use `props.level` instead\n */\n 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 schema,\n }: {\n context: Pick<EditorContext, 'schema'>\n /**\n * @deprecated Use `context.schema` instead\n */\n schema: EditorContext['schema']\n }) => string | undefined\n orderedList?: ({\n context,\n schema,\n }: {\n context: Pick<EditorContext, 'schema'>\n /**\n * @deprecated Use `context.schema` instead\n */\n schema: EditorContext['schema']\n }) => string | undefined\n boldDecorator?: ({\n context,\n schema,\n }: {\n context: Pick<EditorContext, 'schema'>\n /**\n * @deprecated Use `context.schema` instead\n */\n schema: EditorContext['schema']\n }) => string | undefined\n codeDecorator?: ({\n context,\n schema,\n }: {\n context: Pick<EditorContext, 'schema'>\n /**\n * @deprecated Use `context.schema` instead\n */\n schema: EditorContext['schema']\n }) => string | undefined\n italicDecorator?: ({\n context,\n schema,\n }: {\n context: Pick<EditorContext, 'schema'>\n /**\n * @deprecated Use `context.schema` instead\n */\n schema: EditorContext['schema']\n }) => string | undefined\n strikeThroughDecorator?: ({\n context,\n schema,\n }: {\n context: Pick<EditorContext, 'schema'>\n /**\n * @deprecated Use `context.schema` instead\n */\n schema: 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.0.0",
3
+ "version": "3.0.2",
4
4
  "description": "Adds helpful Markdown shortcuts to the editor",
5
5
  "keywords": [
6
6
  "portabletext",
@@ -36,8 +36,8 @@
36
36
  "dist"
37
37
  ],
38
38
  "dependencies": {
39
- "@portabletext/plugin-character-pair-decorator": "^3.0.0",
40
- "@portabletext/plugin-input-rule": "~0.5.2"
39
+ "@portabletext/plugin-character-pair-decorator": "^3.0.2",
40
+ "@portabletext/plugin-input-rule": "~0.5.3"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@types/react": "^19.2.2",
@@ -51,12 +51,12 @@
51
51
  "typescript": "5.9.3",
52
52
  "typescript-eslint": "^8.46.1",
53
53
  "vitest": "^4.0.6",
54
- "@portabletext/editor": "^2.19.0",
54
+ "@portabletext/editor": "^2.19.1",
55
55
  "racejar": "2.0.0"
56
56
  },
57
57
  "peerDependencies": {
58
58
  "react": "^19",
59
- "@portabletext/editor": "^2.19.0"
59
+ "@portabletext/editor": "^2.19.1"
60
60
  },
61
61
  "engines": {
62
62
  "node": ">=20.19 <22 || >=22.12"
@@ -16,8 +16,13 @@ export type MarkdownBehaviorsConfig = {
16
16
  }) => ObjectWithOptionalKey | undefined
17
17
  defaultStyle?: ({
18
18
  context,
19
+ schema,
19
20
  }: {
20
21
  context: Pick<EditorContext, 'schema'>
22
+ /**
23
+ * @deprecated Use `context.schema` instead
24
+ */
25
+ schema: EditorContext['schema']
21
26
  }) => string | undefined
22
27
  }
23
28
 
@@ -98,6 +103,7 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
98
103
 
99
104
  const defaultStyle = config.defaultStyle?.({
100
105
  context: {schema: snapshot.context.schema},
106
+ schema: snapshot.context.schema,
101
107
  })
102
108
 
103
109
  if (
@@ -0,0 +1,108 @@
1
+ Feature: Markdown Behaviors
2
+
3
+ Background:
4
+ Given a global keymap
5
+
6
+ Scenario: Automatic blockquote
7
+ Given the text ">"
8
+ When "{Space}" is pressed
9
+ Then the text is "q:"
10
+
11
+ Scenario: Automatic blockquote not toggled by space in the beginning
12
+ Given the text ">"
13
+ When the caret is put before ">"
14
+ When "{Space}" is pressed
15
+ Then the text is " >"
16
+
17
+ Scenario: Automatic blockquote in non-empty block
18
+ Given the text ">foo"
19
+ When the caret is put before "f"
20
+ And "{Space}" is pressed
21
+ Then the text is "q:foo"
22
+
23
+ Scenario Outline: Automatic headings
24
+ Given the text <text>
25
+ When "{Space}" is pressed
26
+ Then the text is <new text>
27
+
28
+ Examples:
29
+ | text | new text |
30
+ | "#" | "h1:" |
31
+ | "##" | "h2:" |
32
+ | "###" | "h3:" |
33
+ | "####" | "h4:" |
34
+ | "#####" | "h5:" |
35
+ | "######" | "h6:" |
36
+ | "#######" | "####### " |
37
+
38
+ Scenario Outline: Automatic headings not toggled by space in the beginning
39
+ Given the text <text>
40
+ When the caret is put <position>
41
+ When "{Space}" is pressed
42
+ Then the text is <new text>
43
+
44
+ Examples:
45
+ | text | position | new text |
46
+ | "#" | before "#" | " #" |
47
+ | "##" | before "##" | " ##" |
48
+ | "###" | before "###" | " ###" |
49
+
50
+ Scenario Outline: Automatic headings toggled by space mid-heading
51
+ Given the text <text>
52
+ When the caret is put <position>
53
+ When "{ArrowRight}" is pressed
54
+ When "{Space}" is pressed
55
+ Then the text is <new text>
56
+
57
+ Examples:
58
+ | text | position | new text |
59
+ | "##" | before "##" | "h1:#" |
60
+ | "###" | before "###" | "h1:##" |
61
+
62
+ Scenario Outline: Automatic headings in non-empty block
63
+ Given the text <text>
64
+ When the caret is put <position>
65
+ And "{Space}" is pressed
66
+ Then the text is <new text>
67
+
68
+ Examples:
69
+ | text | position | new text |
70
+ | "foo" | before "foo" | " foo" |
71
+ | "#foo" | before "foo" | "h1:foo" |
72
+ | "##foo" | before "foo" | "h2:foo" |
73
+ | "###foo" | before "foo" | "h3:foo" |
74
+ | "####foo" | before "foo" | "h4:foo" |
75
+ | "#####foo" | before "foo" | "h5:foo" |
76
+ | "######foo" | before "foo" | "h6:foo" |
77
+ | "#######foo" | before "foo" | "####### foo" |
78
+
79
+ Scenario Outline: Clear style on Backspace
80
+ Given the text "foo"
81
+ When <style> is toggled
82
+ And "{Backspace}" is pressed 4 times
83
+ Then the text is ""
84
+
85
+ Examples:
86
+ | style |
87
+ | "h1" |
88
+ | "h2" |
89
+ | "h3" |
90
+ | "h4" |
91
+ | "h5" |
92
+ | "h6" |
93
+
94
+ Scenario Outline: Clear style on Backspace in empty block
95
+ Given the text "foo"
96
+ When <style> is toggled
97
+ And "{Backspace}" is pressed 4 times
98
+ And "bar" is typed
99
+ Then the text is "bar"
100
+
101
+ Examples:
102
+ | style |
103
+ | "h1" |
104
+ | "h2" |
105
+ | "h3" |
106
+ | "h4" |
107
+ | "h5" |
108
+ | "h6" |
@@ -0,0 +1,63 @@
1
+ import {defineSchema} from '@portabletext/editor'
2
+ import {parameterTypes} from '@portabletext/editor/test'
3
+ import {
4
+ createTestEditor,
5
+ stepDefinitions,
6
+ type Context,
7
+ } from '@portabletext/editor/test/vitest'
8
+ import {Before} from 'racejar'
9
+ import {Feature} from 'racejar/vitest'
10
+ import behaviorMarkdownFeature from './behavior.markdown.feature?raw'
11
+ import {MarkdownShortcutsPlugin} from './plugin.markdown-shortcuts'
12
+
13
+ Feature({
14
+ hooks: [
15
+ Before(async (context: Context) => {
16
+ const {editor, locator} = await createTestEditor({
17
+ children: (
18
+ <MarkdownShortcutsPlugin
19
+ defaultStyle={({context}) => context.schema.styles[0]?.name}
20
+ headingStyle={({context, props}) =>
21
+ context.schema.styles.find(
22
+ (style) => style.name === `h${props.level}`,
23
+ )?.name
24
+ }
25
+ blockquoteStyle={({context}) =>
26
+ context.schema.styles.find((style) => style.name === 'blockquote')
27
+ ?.name
28
+ }
29
+ unorderedList={({context}) =>
30
+ context.schema.lists.find((list) => list.name === 'bullet')?.name
31
+ }
32
+ orderedList={({context}) =>
33
+ context.schema.lists.find((list) => list.name === 'number')?.name
34
+ }
35
+ />
36
+ ),
37
+ schemaDefinition: defineSchema({
38
+ annotations: [{name: 'comment'}, {name: 'link'}],
39
+ decorators: [{name: 'em'}, {name: 'strong'}],
40
+ blockObjects: [{name: 'image'}, {name: 'break'}],
41
+ inlineObjects: [{name: 'stock-ticker'}],
42
+ lists: [{name: 'bullet'}, {name: 'number'}],
43
+ styles: [
44
+ {name: 'normal'},
45
+ {name: 'h1'},
46
+ {name: 'h2'},
47
+ {name: 'h3'},
48
+ {name: 'h4'},
49
+ {name: 'h5'},
50
+ {name: 'h6'},
51
+ {name: 'blockquote'},
52
+ ],
53
+ }),
54
+ })
55
+
56
+ context.locator = locator
57
+ context.editor = editor
58
+ }),
59
+ ],
60
+ featureText: behaviorMarkdownFeature,
61
+ stepDefinitions: stepDefinitions,
62
+ parameterTypes,
63
+ })
@@ -21,20 +21,40 @@ import {createUnorderedListRule} from './rule.unordered-list'
21
21
  export type MarkdownShortcutsPluginProps = MarkdownBehaviorsConfig & {
22
22
  blockquoteStyle?: ({
23
23
  context,
24
+ schema,
24
25
  }: {
25
26
  context: Pick<EditorContext, 'schema'>
27
+ /**
28
+ * @deprecated Use `context.schema` instead
29
+ */
30
+ schema: EditorContext['schema']
26
31
  }) => string | undefined
27
32
  defaultStyle?: ({
28
33
  context,
34
+ schema,
29
35
  }: {
30
36
  context: Pick<EditorContext, 'schema'>
37
+ /**
38
+ * @deprecated Use `context.schema` instead
39
+ */
40
+ schema: EditorContext['schema']
31
41
  }) => string | undefined
32
42
  headingStyle?: ({
33
43
  context,
44
+ schema,
34
45
  props,
46
+ level,
35
47
  }: {
36
48
  context: Pick<EditorContext, 'schema'>
49
+ /**
50
+ * @deprecated Use `context.schema` instead
51
+ */
52
+ schema: EditorContext['schema']
37
53
  props: {level: number}
54
+ /**
55
+ * @deprecated Use `props.level` instead
56
+ */
57
+ level: number
38
58
  }) => string | undefined
39
59
  linkObject?: ({
40
60
  context,
@@ -45,33 +65,63 @@ export type MarkdownShortcutsPluginProps = MarkdownBehaviorsConfig & {
45
65
  }) => ObjectWithOptionalKey | undefined
46
66
  unorderedList?: ({
47
67
  context,
68
+ schema,
48
69
  }: {
49
70
  context: Pick<EditorContext, 'schema'>
71
+ /**
72
+ * @deprecated Use `context.schema` instead
73
+ */
74
+ schema: EditorContext['schema']
50
75
  }) => string | undefined
51
76
  orderedList?: ({
52
77
  context,
78
+ schema,
53
79
  }: {
54
80
  context: Pick<EditorContext, 'schema'>
81
+ /**
82
+ * @deprecated Use `context.schema` instead
83
+ */
84
+ schema: EditorContext['schema']
55
85
  }) => string | undefined
56
86
  boldDecorator?: ({
57
87
  context,
88
+ schema,
58
89
  }: {
59
90
  context: Pick<EditorContext, 'schema'>
91
+ /**
92
+ * @deprecated Use `context.schema` instead
93
+ */
94
+ schema: EditorContext['schema']
60
95
  }) => string | undefined
61
96
  codeDecorator?: ({
62
97
  context,
98
+ schema,
63
99
  }: {
64
100
  context: Pick<EditorContext, 'schema'>
101
+ /**
102
+ * @deprecated Use `context.schema` instead
103
+ */
104
+ schema: EditorContext['schema']
65
105
  }) => string | undefined
66
106
  italicDecorator?: ({
67
107
  context,
108
+ schema,
68
109
  }: {
69
110
  context: Pick<EditorContext, 'schema'>
111
+ /**
112
+ * @deprecated Use `context.schema` instead
113
+ */
114
+ schema: EditorContext['schema']
70
115
  }) => string | undefined
71
116
  strikeThroughDecorator?: ({
72
117
  context,
118
+ schema,
73
119
  }: {
74
120
  context: Pick<EditorContext, 'schema'>
121
+ /**
122
+ * @deprecated Use `context.schema` instead
123
+ */
124
+ schema: EditorContext['schema']
75
125
  }) => string | undefined
76
126
  }
77
127
 
@@ -6,8 +6,13 @@ import {defineInputRule} from '@portabletext/plugin-input-rule'
6
6
  export function createBlockquoteRule(config: {
7
7
  blockquoteStyle: ({
8
8
  context,
9
+ schema,
9
10
  }: {
10
11
  context: Pick<EditorContext, 'schema'>
12
+ /**
13
+ * @deprecated Use `context.schema` instead
14
+ */
15
+ schema: EditorContext['schema']
11
16
  }) => string | undefined
12
17
  }) {
13
18
  return defineInputRule({
@@ -15,6 +20,7 @@ export function createBlockquoteRule(config: {
15
20
  guard: ({snapshot, event}) => {
16
21
  const style = config.blockquoteStyle({
17
22
  context: {schema: snapshot.context.schema},
23
+ schema: snapshot.context.schema,
18
24
  })
19
25
 
20
26
  if (!style) {
@@ -6,10 +6,20 @@ import {defineInputRule} from '@portabletext/plugin-input-rule'
6
6
  export function createHeadingRule(config: {
7
7
  headingStyle: ({
8
8
  context,
9
+ schema,
9
10
  props,
11
+ level,
10
12
  }: {
11
13
  context: Pick<EditorContext, 'schema'>
14
+ /**
15
+ * @deprecated Use `context.schema` instead
16
+ */
17
+ schema: EditorContext['schema']
12
18
  props: {level: number}
19
+ /**
20
+ * @deprecated Use `props.level` instead
21
+ */
22
+ level: number
13
23
  }) => string | undefined
14
24
  }) {
15
25
  return defineInputRule({
@@ -31,7 +41,9 @@ export function createHeadingRule(config: {
31
41
 
32
42
  const style = config.headingStyle({
33
43
  context: {schema: snapshot.context.schema},
44
+ schema: snapshot.context.schema,
34
45
  props: {level},
46
+ level,
35
47
  })
36
48
 
37
49
  if (!style) {
@@ -6,8 +6,13 @@ import {defineInputRule} from '@portabletext/plugin-input-rule'
6
6
  export function createOrderedListRule(config: {
7
7
  orderedList: ({
8
8
  context,
9
+ schema,
9
10
  }: {
10
11
  context: Pick<EditorContext, 'schema'>
12
+ /**
13
+ * @deprecated Use `context.schema` instead
14
+ */
15
+ schema: EditorContext['schema']
11
16
  }) => string | undefined
12
17
  }) {
13
18
  return defineInputRule({
@@ -15,6 +20,7 @@ export function createOrderedListRule(config: {
15
20
  guard: ({snapshot, event}) => {
16
21
  const orderedList = config.orderedList({
17
22
  context: {schema: snapshot.context.schema},
23
+ schema: snapshot.context.schema,
18
24
  })
19
25
 
20
26
  if (!orderedList) {
@@ -6,8 +6,13 @@ import {defineInputRule} from '@portabletext/plugin-input-rule'
6
6
  export function createUnorderedListRule(config: {
7
7
  unorderedList: ({
8
8
  context,
9
+ schema,
9
10
  }: {
10
11
  context: Pick<EditorContext, 'schema'>
12
+ /**
13
+ * @deprecated Use `context.schema` instead
14
+ */
15
+ schema: EditorContext['schema']
11
16
  }) => string | undefined
12
17
  }) {
13
18
  return defineInputRule({
@@ -15,6 +20,7 @@ export function createUnorderedListRule(config: {
15
20
  guard: ({snapshot, event}) => {
16
21
  const unorderedList = config.unorderedList({
17
22
  context: {schema: snapshot.context.schema},
23
+ schema: snapshot.context.schema,
18
24
  })
19
25
 
20
26
  if (!unorderedList) {