@portabletext/plugin-markdown-shortcuts 1.1.2 → 1.2.0

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