@portabletext/editor 1.33.5 → 1.34.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.
Files changed (50) hide show
  1. package/lib/_chunks-cjs/behavior.core.cjs +14 -8
  2. package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
  3. package/lib/_chunks-cjs/behavior.markdown.cjs +20 -12
  4. package/lib/_chunks-cjs/behavior.markdown.cjs.map +1 -1
  5. package/lib/_chunks-cjs/plugin.event-listener.cjs +95 -70
  6. package/lib/_chunks-cjs/plugin.event-listener.cjs.map +1 -1
  7. package/lib/_chunks-cjs/util.block-offsets-to-selection.cjs +103 -46
  8. package/lib/_chunks-cjs/util.block-offsets-to-selection.cjs.map +1 -1
  9. package/lib/_chunks-es/behavior.core.js +14 -8
  10. package/lib/_chunks-es/behavior.core.js.map +1 -1
  11. package/lib/_chunks-es/behavior.markdown.js +20 -12
  12. package/lib/_chunks-es/behavior.markdown.js.map +1 -1
  13. package/lib/_chunks-es/plugin.event-listener.js +101 -75
  14. package/lib/_chunks-es/plugin.event-listener.js.map +1 -1
  15. package/lib/_chunks-es/util.block-offsets-to-selection.js +102 -46
  16. package/lib/_chunks-es/util.block-offsets-to-selection.js.map +1 -1
  17. package/lib/behaviors/index.d.cts +5 -34
  18. package/lib/behaviors/index.d.ts +5 -34
  19. package/lib/index.d.cts +300 -1460
  20. package/lib/index.d.ts +300 -1460
  21. package/lib/plugins/index.cjs +60 -43
  22. package/lib/plugins/index.cjs.map +1 -1
  23. package/lib/plugins/index.d.cts +300 -1460
  24. package/lib/plugins/index.d.ts +300 -1460
  25. package/lib/plugins/index.js +63 -45
  26. package/lib/plugins/index.js.map +1 -1
  27. package/lib/selectors/index.d.cts +12 -0
  28. package/lib/selectors/index.d.ts +12 -0
  29. package/lib/utils/index.cjs +23 -1
  30. package/lib/utils/index.cjs.map +1 -1
  31. package/lib/utils/index.d.cts +11 -0
  32. package/lib/utils/index.d.ts +11 -0
  33. package/lib/utils/index.js +25 -2
  34. package/lib/utils/index.js.map +1 -1
  35. package/package.json +6 -6
  36. package/src/behavior-actions/behavior.action.block.set.ts +48 -5
  37. package/src/behavior-actions/behavior.action.block.unset.ts +77 -3
  38. package/src/behavior-actions/behavior.action.decorator.add.ts +30 -8
  39. package/src/behavior-actions/behavior.actions.ts +1 -18
  40. package/src/behaviors/behavior.core.lists.ts +18 -14
  41. package/src/behaviors/behavior.markdown-emphasis.ts +82 -41
  42. package/src/behaviors/behavior.markdown.ts +14 -12
  43. package/src/behaviors/behavior.types.ts +2 -14
  44. package/src/converters/converter.portable-text.deserialize.test.ts +3 -2
  45. package/src/internal-utils/parse-blocks.test.ts +455 -0
  46. package/src/internal-utils/parse-blocks.ts +202 -87
  47. package/src/utils/index.ts +1 -0
  48. package/src/utils/util.child-selection-point-to-block-offset.ts +55 -0
  49. package/src/behavior-actions/behavior.action.text-block.set.ts +0 -25
  50. package/src/behavior-actions/behavior.action.text-block.unset.ts +0 -17
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: !0 });
3
- var reactCompilerRuntime = require("react-compiler-runtime"), React = require("react"), plugin_eventListener = require("../_chunks-cjs/plugin.event-listener.cjs"), behavior_markdown = require("../_chunks-cjs/behavior.markdown.cjs"), react = require("@xstate/react"), isEqual = require("lodash/isEqual.js"), xstate = require("xstate"), selector_isAtTheStartOfBlock = require("../_chunks-cjs/selector.is-at-the-start-of-block.cjs"), util_sliceBlocks = require("../_chunks-cjs/util.slice-blocks.cjs"), selector_getTextBefore = require("../_chunks-cjs/selector.get-text-before.cjs"), behavior_core = require("../_chunks-cjs/behavior.core.cjs"), jsxRuntime = require("react/jsx-runtime"), utils_index = require("../utils/index.cjs");
3
+ var reactCompilerRuntime = require("react-compiler-runtime"), React = require("react"), plugin_eventListener = require("../_chunks-cjs/plugin.event-listener.cjs"), behavior_markdown = require("../_chunks-cjs/behavior.markdown.cjs"), react = require("@xstate/react"), isEqual = require("lodash/isEqual.js"), xstate = require("xstate"), selector_isAtTheStartOfBlock = require("../_chunks-cjs/selector.is-at-the-start-of-block.cjs"), util_sliceBlocks = require("../_chunks-cjs/util.slice-blocks.cjs"), util_blockOffsetsToSelection = require("../_chunks-cjs/util.block-offsets-to-selection.cjs"), utils_index = require("../utils/index.cjs"), selector_getTextBefore = require("../_chunks-cjs/selector.get-text-before.cjs"), behavior_core = require("../_chunks-cjs/behavior.core.cjs"), jsxRuntime = require("react/jsx-runtime");
4
4
  function _interopDefaultCompat(e) {
5
5
  return e && typeof e == "object" && "default" in e ? e : { default: e };
6
6
  }
@@ -63,7 +63,7 @@ const emphasisListener = ({
63
63
  event
64
64
  }) => {
65
65
  const boldDecorator = input.boldDecorator, italicDecorator = input.italicDecorator;
66
- if (boldDecorator === void 0 && italicDecorator === void 0 || event.text !== "*" && event.text !== "_")
66
+ if (boldDecorator === void 0 && italicDecorator === void 0)
67
67
  return !1;
68
68
  const focusTextBlock = selector_isAtTheStartOfBlock.getFocusTextBlock({
69
69
  context
@@ -82,38 +82,30 @@ const emphasisListener = ({
82
82
  const prefixOffsets = {
83
83
  anchor: {
84
84
  path: focusTextBlock.path,
85
- offset: textBefore.length - textToItalic.length + 1
85
+ // Example: "foo *bar*".length - "*bar*".length = 4
86
+ offset: `${textBefore}${event.text}`.length - textToItalic.length
86
87
  },
87
88
  focus: {
88
89
  path: focusTextBlock.path,
89
- offset: textBefore.length - textToItalic.length + 1 + 1
90
+ // Example: "foo *bar*".length - "*bar*".length + 1 = 5
91
+ offset: `${textBefore}${event.text}`.length - textToItalic.length + 1
90
92
  }
91
93
  }, suffixOffsets = {
92
94
  anchor: {
93
95
  path: focusTextBlock.path,
94
- offset: selectionStartOffset.offset
96
+ // Example: "foo *bar|" (8) + "*".length - 1 = 8
97
+ offset: selectionStartOffset.offset + event.text.length - 1
95
98
  },
96
99
  focus: {
97
100
  path: focusTextBlock.path,
98
- offset: selectionStartOffset.offset + 1
101
+ // Example: "foo *bar|" (8) + "*".length = 9
102
+ offset: selectionStartOffset.offset + event.text.length
99
103
  }
100
- }, anchor = util_sliceBlocks.blockOffsetToSpanSelectionPoint({
101
- value: context.value,
102
- blockOffset: prefixOffsets.focus,
103
- direction: "backward"
104
- }), focus = util_sliceBlocks.blockOffsetToSpanSelectionPoint({
105
- value: context.value,
106
- blockOffset: suffixOffsets.anchor,
107
- direction: "forward"
108
- });
109
- return !anchor || !focus ? !1 : {
104
+ };
105
+ return {
110
106
  prefixOffsets,
111
107
  suffixOffsets,
112
- decorator: italicDecorator,
113
- selection: {
114
- anchor,
115
- focus
116
- }
108
+ decorator: italicDecorator
117
109
  };
118
110
  }
119
111
  const textToBold = getTextToBold(`${textBefore}${event.text}`);
@@ -121,38 +113,58 @@ const emphasisListener = ({
121
113
  const prefixOffsets = {
122
114
  anchor: {
123
115
  path: focusTextBlock.path,
124
- offset: textBefore.length - textToBold.length + 1
116
+ // Example: "foo **bar**".length - "**bar**".length = 4
117
+ offset: `${textBefore}${event.text}`.length - textToBold.length
125
118
  },
126
119
  focus: {
127
120
  path: focusTextBlock.path,
128
- offset: textBefore.length - textToBold.length + 1 + 2
121
+ // Example: "foo **bar**".length - "**bar**".length + 2 = 6
122
+ offset: `${textBefore}${event.text}`.length - textToBold.length + 2
129
123
  }
130
- }, suffixOffsets = {
124
+ }, prefixSelection = util_blockOffsetsToSelection.blockOffsetsToSelection({
125
+ value: context.value,
126
+ offsets: prefixOffsets
127
+ }), inlineObjectBeforePrefixFocus = selector_isAtTheStartOfBlock.getPreviousInlineObject({
128
+ context: {
129
+ ...context,
130
+ selection: prefixSelection ? {
131
+ anchor: prefixSelection.focus,
132
+ focus: prefixSelection.focus
133
+ } : null
134
+ }
135
+ }), inlineObjectBeforePrefixFocusOffset = inlineObjectBeforePrefixFocus ? utils_index.childSelectionPointToBlockOffset({
136
+ value: context.value,
137
+ selectionPoint: {
138
+ path: inlineObjectBeforePrefixFocus.path,
139
+ offset: 0
140
+ }
141
+ }) : void 0;
142
+ if (inlineObjectBeforePrefixFocusOffset && inlineObjectBeforePrefixFocusOffset.offset > prefixOffsets.anchor.offset && inlineObjectBeforePrefixFocusOffset.offset < prefixOffsets.focus.offset)
143
+ return !1;
144
+ const suffixOffsets = {
131
145
  anchor: {
132
146
  path: focusTextBlock.path,
133
- offset: selectionStartOffset.offset - 1
147
+ // Example: "foo **bar*|" (10) + "*".length - 2 = 9
148
+ offset: selectionStartOffset.offset + event.text.length - 2
134
149
  },
135
150
  focus: {
136
151
  path: focusTextBlock.path,
137
- offset: selectionStartOffset.offset + 1
152
+ // Example: "foo **bar*|" (10) + "*".length = 11
153
+ offset: selectionStartOffset.offset + event.text.length
138
154
  }
139
- }, anchor = util_sliceBlocks.blockOffsetToSpanSelectionPoint({
140
- value: context.value,
141
- blockOffset: prefixOffsets.focus,
142
- direction: "backward"
143
- }), focus = util_sliceBlocks.blockOffsetToSpanSelectionPoint({
155
+ }, previousInlineObject = selector_isAtTheStartOfBlock.getPreviousInlineObject({
156
+ context
157
+ }), previousInlineObjectOffset = previousInlineObject ? utils_index.childSelectionPointToBlockOffset({
144
158
  value: context.value,
145
- blockOffset: suffixOffsets.anchor,
146
- direction: "forward"
147
- });
148
- return !anchor || !focus ? !1 : {
159
+ selectionPoint: {
160
+ path: previousInlineObject.path,
161
+ offset: 0
162
+ }
163
+ }) : void 0;
164
+ return previousInlineObjectOffset && previousInlineObjectOffset.offset > suffixOffsets.anchor.offset && previousInlineObjectOffset.offset < suffixOffsets.focus.offset ? !1 : {
149
165
  prefixOffsets,
150
166
  suffixOffsets,
151
- decorator: boldDecorator,
152
- selection: {
153
- anchor,
154
- focus
155
- }
167
+ decorator: boldDecorator
156
168
  };
157
169
  }
158
170
  return !1;
@@ -162,18 +174,23 @@ const emphasisListener = ({
162
174
  }) => [event], (_, {
163
175
  prefixOffsets,
164
176
  suffixOffsets,
165
- decorator,
166
- selection
177
+ decorator
167
178
  }) => [{
168
179
  type: "decorator.add",
169
180
  decorator,
170
- selection
181
+ offsets: {
182
+ anchor: prefixOffsets.focus,
183
+ focus: suffixOffsets.anchor
184
+ }
171
185
  }, {
172
186
  type: "delete.text",
173
187
  ...suffixOffsets
174
188
  }, {
175
189
  type: "delete.text",
176
190
  ...prefixOffsets
191
+ }, {
192
+ type: "decorator.remove",
193
+ decorator
177
194
  }, {
178
195
  type: "effect",
179
196
  effect: () => {
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../src/plugins/plugin.behavior.tsx","../../src/plugins/plugin.editor-ref.tsx","../../src/internal-utils/get-text-to-emphasize.ts","../../src/behaviors/behavior.markdown-emphasis.ts","../../src/plugins/plugin.markdown.tsx","../../src/plugins/plugin.one-line.tsx"],"sourcesContent":["import {useEffect} from 'react'\nimport type {Behavior} from '../behaviors'\nimport {useEditor} from '../editor/editor-provider'\n\n/**\n * @beta\n */\nexport function BehaviorPlugin(props: {behaviors: Array<Behavior>}) {\n const editor = useEditor()\n\n useEffect(() => {\n const unregisterBehaviors = props.behaviors.map((behavior) =>\n editor.registerBehavior({behavior}),\n )\n\n return () => {\n unregisterBehaviors.forEach((unregister) => unregister())\n }\n }, [editor, props.behaviors])\n\n return null\n}\n","import React from 'react'\nimport type {Editor} from '../editor/create-editor'\nimport {useEditor} from '../editor/editor-provider'\n\n/**\n * @beta\n */\nexport const EditorRefPlugin = React.forwardRef<Editor | null>((_, ref) => {\n const editor = useEditor()\n\n const portableTextEditorRef = React.useRef(editor)\n\n React.useImperativeHandle(ref, () => portableTextEditorRef.current, [])\n\n return null\n})\nEditorRefPlugin.displayName = 'EditorRefPlugin'\n","const asteriskPairRegex = '(?<!\\\\*)\\\\*(?!\\\\s)([^*\\\\n]+?)(?<!\\\\s)\\\\*(?!\\\\*)'\nconst underscorePairRegex = '(?<!_)_(?!\\\\s)([^_\\\\n]+?)(?<!\\\\s)_(?!_)'\nconst italicRegex = new RegExp(`(${asteriskPairRegex}|${underscorePairRegex})$`)\n\nconst doubleAsteriskPairRegex =\n '(?<!\\\\*)\\\\*\\\\*(?!\\\\s)([^*\\\\n]+?)(?<!\\\\s)\\\\*\\\\*(?!\\\\*)'\nconst doubleUnderscorePairRegex = '(?<!_)__(?!\\\\s)([^_\\\\n]+?)(?<!\\\\s)__(?!_)'\nconst boldRegex = new RegExp(\n `(${doubleAsteriskPairRegex}|${doubleUnderscorePairRegex})$`,\n)\n\nexport function getTextToItalic(text: string) {\n return text.match(italicRegex)?.at(0)\n}\n\nexport function getTextToBold(text: string) {\n return text.match(boldRegex)?.at(0)\n}\n","import {useActorRef} from '@xstate/react'\nimport {isEqual} from 'lodash'\nimport {\n assign,\n fromCallback,\n setup,\n type AnyEventObject,\n type CallbackLogicFunction,\n} from 'xstate'\nimport type {Editor} from '../editor/create-editor'\nimport {useEditor} from '../editor/editor-provider'\nimport {\n getTextToBold,\n getTextToItalic,\n} from '../internal-utils/get-text-to-emphasize'\nimport type {EditorSchema} from '../selectors'\nimport * as selectors from '../selectors'\nimport * as utils from '../utils'\nimport {defineBehavior} from './behavior.types'\n\n/**\n * @beta\n */\nexport type MarkdownEmphasisBehaviorsConfig = {\n boldDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n italicDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n}\n\n/**\n * @beta\n */\nexport function useMarkdownEmphasisBehaviors(props: {\n config: MarkdownEmphasisBehaviorsConfig\n}) {\n const editor = useEditor()\n\n useActorRef(emphasisMachine, {\n input: {\n editor,\n boldDecorator: props.config.boldDecorator?.({\n schema: editor.getSnapshot().context.schema,\n }),\n italicDecorator: props.config.italicDecorator?.({\n schema: editor.getSnapshot().context.schema,\n }),\n },\n })\n}\n\ntype MarkdownEmphasisEvent =\n | {\n type: 'emphasis.add'\n blockOffset: utils.BlockOffset\n }\n | {\n type: 'selection'\n blockOffsets?: {\n anchor: utils.BlockOffset\n focus: utils.BlockOffset\n }\n }\n | {\n type: 'delete.backward'\n }\n\nconst emphasisListener: CallbackLogicFunction<\n AnyEventObject,\n MarkdownEmphasisEvent,\n {editor: Editor; boldDecorator?: string; italicDecorator?: string}\n> = ({sendBack, input}) => {\n const unregister = input.editor.registerBehavior({\n behavior: defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const boldDecorator = input.boldDecorator\n const italicDecorator = input.italicDecorator\n\n if (boldDecorator === undefined && italicDecorator === undefined) {\n return false\n }\n\n if (event.text !== '*' && event.text !== '_') {\n return false\n }\n\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const selectionStartPoint = selectors.getSelectionStartPoint({context})\n const selectionStartOffset = selectionStartPoint\n ? utils.spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: selectionStartPoint,\n })\n : undefined\n\n if (!focusTextBlock || !selectionStartOffset) {\n return false\n }\n\n const textBefore = selectors.getBlockTextBefore({context})\n\n const textToItalic = getTextToItalic(`${textBefore}${event.text}`)\n\n if (textToItalic !== undefined && italicDecorator !== undefined) {\n const prefixOffsets = {\n anchor: {\n path: focusTextBlock.path,\n offset: textBefore.length - textToItalic.length + 1,\n },\n focus: {\n path: focusTextBlock.path,\n offset: textBefore.length - textToItalic.length + 1 + 1,\n },\n }\n const suffixOffsets = {\n anchor: {\n path: focusTextBlock.path,\n offset: selectionStartOffset.offset,\n },\n focus: {\n path: focusTextBlock.path,\n offset: selectionStartOffset.offset + 1,\n },\n }\n\n const anchor = utils.blockOffsetToSpanSelectionPoint({\n value: context.value,\n blockOffset: prefixOffsets.focus,\n direction: 'backward',\n })\n const focus = utils.blockOffsetToSpanSelectionPoint({\n value: context.value,\n blockOffset: suffixOffsets.anchor,\n direction: 'forward',\n })\n\n if (!anchor || !focus) {\n return false\n }\n\n return {\n prefixOffsets,\n suffixOffsets,\n decorator: italicDecorator,\n selection: {anchor, focus},\n }\n }\n\n const textToBold = getTextToBold(`${textBefore}${event.text}`)\n\n if (textToBold !== undefined && boldDecorator !== undefined) {\n const prefixOffsets = {\n anchor: {\n path: focusTextBlock.path,\n offset: textBefore.length - textToBold.length + 1,\n },\n focus: {\n path: focusTextBlock.path,\n offset: textBefore.length - textToBold.length + 1 + 2,\n },\n }\n const suffixOffsets = {\n anchor: {\n path: focusTextBlock.path,\n offset: selectionStartOffset.offset - 1,\n },\n focus: {\n path: focusTextBlock.path,\n offset: selectionStartOffset.offset + 1,\n },\n }\n const anchor = utils.blockOffsetToSpanSelectionPoint({\n value: context.value,\n blockOffset: prefixOffsets.focus,\n direction: 'backward',\n })\n const focus = utils.blockOffsetToSpanSelectionPoint({\n value: context.value,\n blockOffset: suffixOffsets.anchor,\n direction: 'forward',\n })\n\n if (!anchor || !focus) {\n return false\n }\n\n return {\n prefixOffsets,\n suffixOffsets,\n decorator: boldDecorator,\n selection: {anchor, focus},\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [event],\n (_, {prefixOffsets, suffixOffsets, decorator, selection}) => [\n {\n type: 'decorator.add',\n decorator,\n selection,\n },\n {\n type: 'delete.text',\n ...suffixOffsets,\n },\n {\n type: 'delete.text',\n ...prefixOffsets,\n },\n {\n type: 'effect',\n effect: () => {\n sendBack({\n type: 'emphasis.add',\n blockOffset: {\n ...suffixOffsets.anchor,\n offset:\n suffixOffsets.anchor.offset -\n (prefixOffsets.focus.offset - prefixOffsets.anchor.offset),\n },\n })\n },\n },\n ],\n ],\n }),\n })\n\n return unregister\n}\n\nconst selectionListenerCallback: CallbackLogicFunction<\n AnyEventObject,\n MarkdownEmphasisEvent,\n {editor: Editor}\n> = ({sendBack, input}) => {\n const unregister = input.editor.registerBehavior({\n behavior: defineBehavior({\n on: 'select',\n guard: ({context, event}) => {\n if (!event.selection) {\n return {blockOffsets: undefined}\n }\n\n const anchor = utils.spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: event.selection.anchor,\n })\n const focus = utils.spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: event.selection.focus,\n })\n\n if (!anchor || !focus) {\n return {blockOffsets: undefined}\n }\n\n return {\n blockOffsets: {\n anchor,\n focus,\n },\n }\n },\n actions: [\n (_, {blockOffsets}) => [\n {\n type: 'effect',\n effect: () => {\n sendBack({type: 'selection', blockOffsets})\n },\n },\n ],\n ],\n }),\n })\n\n return unregister\n}\n\nconst deleteBackwardListenerCallback: CallbackLogicFunction<\n AnyEventObject,\n MarkdownEmphasisEvent,\n {editor: Editor}\n> = ({sendBack, input}) => {\n const unregister = input.editor.registerBehavior({\n behavior: defineBehavior({\n on: 'delete.backward',\n actions: [\n () => [\n {\n type: 'history.undo',\n },\n {\n type: 'effect',\n effect: () => {\n sendBack({type: 'delete.backward'})\n },\n },\n ],\n ],\n }),\n })\n\n return unregister\n}\n\nconst emphasisMachine = setup({\n types: {\n context: {} as {\n boldDecorator?: string\n italicDecorator?: string\n offsetAfterEmphasis?: utils.BlockOffset\n editor: Editor\n },\n input: {} as {\n boldDecorator?: string\n italicDecorator?: string\n editor: Editor\n },\n events: {} as MarkdownEmphasisEvent,\n },\n actors: {\n 'emphasis listener': fromCallback(emphasisListener),\n 'delete.backward listener': fromCallback(deleteBackwardListenerCallback),\n 'selection listener': fromCallback(selectionListenerCallback),\n },\n}).createMachine({\n id: 'emphasis',\n context: ({input}) => ({\n boldDecorator: input.boldDecorator,\n italicDecorator: input.italicDecorator,\n editor: input.editor,\n }),\n initial: 'idle',\n states: {\n 'idle': {\n invoke: [\n {\n src: 'emphasis listener',\n input: ({context}) => ({\n editor: context.editor,\n boldDecorator: context.boldDecorator,\n italicDecorator: context.italicDecorator,\n }),\n },\n ],\n on: {\n 'emphasis.add': {\n target: 'emphasis added',\n actions: assign({\n offsetAfterEmphasis: ({event}) => event.blockOffset,\n }),\n },\n },\n },\n 'emphasis added': {\n exit: [\n assign({\n offsetAfterEmphasis: undefined,\n }),\n ],\n invoke: [\n {\n src: 'selection listener',\n input: ({context}) => ({editor: context.editor}),\n },\n {\n src: 'delete.backward listener',\n input: ({context}) => ({editor: context.editor}),\n },\n ],\n on: {\n 'selection': {\n target: 'idle',\n guard: ({context, event}) => {\n const selectionChanged = !isEqual(\n {\n anchor: context.offsetAfterEmphasis,\n focus: context.offsetAfterEmphasis,\n },\n event.blockOffsets,\n )\n\n return selectionChanged\n },\n },\n 'delete.backward': {\n target: 'idle',\n },\n },\n },\n },\n})\n","import {useEffect} from 'react'\nimport {\n createMarkdownBehaviors,\n type MarkdownBehaviorsConfig,\n} from '../behaviors/behavior.markdown'\nimport {\n useMarkdownEmphasisBehaviors,\n type MarkdownEmphasisBehaviorsConfig,\n} from '../behaviors/behavior.markdown-emphasis'\nimport {useEditor} from '../editor/editor-provider'\n\n/**\n * @beta\n */\nexport type MarkdownPluginConfig = MarkdownBehaviorsConfig &\n MarkdownEmphasisBehaviorsConfig\n\n/**\n * @beta\n * Add markdown behaviors for common markdown actions such as converting ### to headings, --- to HRs, and more.\n *\n * @example\n * Configure the bundled markdown behaviors\n * ```ts\n * import {EditorProvider} from '@portabletext/editor'\n * import {MarkdownPlugin} from '@portabletext/editor/plugins'\n *\n * function App() {\n * return (\n * <EditorProvider>\n * <MarkdownPlugin\n * config={{\n * boldDecorator: ({schema}) =>\n * schema.decorators.find((decorator) => decorator.value === 'strong')?.value,\n * italicDecorator: ({schema}) =>\n * schema.decorators.find((decorator) => decorator.value === 'em')?.value,\n * horizontalRuleObject: ({schema}) => {\n * const name = schema.blockObjects.find(\n * (object) => object.name === 'break',\n * )?.name\n * return name ? {name} : undefined\n * },\n * defaultStyle: ({schema}) => schema.styles[0].value,\n * headingStyle: ({schema, level}) =>\n * schema.styles.find((style) => style.value === `h${level}`)\n * ?.value,\n * blockquoteStyle: ({schema}) =>\n * schema.styles.find((style) => style.value === 'blockquote')\n * ?.value,\n * unorderedListStyle: ({schema}) =>\n * schema.lists.find((list) => list.value === 'bullet')?.value,\n * orderedListStyle: ({schema}) =>\n * schema.lists.find((list) => list.value === 'number')?.value,\n * }}\n * />\n * {...}\n * </EditorProvider>\n * )\n * }\n */\nexport function MarkdownPlugin(props: {config: MarkdownPluginConfig}) {\n const editor = useEditor()\n useMarkdownEmphasisBehaviors({config: props.config})\n\n useEffect(() => {\n const behaviors = createMarkdownBehaviors(props.config)\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 }, [editor, props.config])\n\n return null\n}\n","import {defineBehavior, raise} from '../behaviors'\nimport * as selectors from '../selectors'\nimport * as utils from '../utils'\nimport {BehaviorPlugin} from './plugin.behavior'\n\nconst oneLineBehaviors = [\n /**\n * Hitting Enter on an expanded selection should just delete that selection\n * without causing a line break.\n */\n defineBehavior({\n on: 'insert.break',\n guard: ({context}) =>\n context.selection && selectors.isSelectionExpanded({context})\n ? {selection: context.selection}\n : false,\n actions: [(_, {selection}) => [{type: 'delete', selection}]],\n }),\n /**\n * All other cases of `insert.break` should be aborted.\n */\n defineBehavior({\n on: 'insert.break',\n actions: [() => [{type: 'noop'}]],\n }),\n /**\n * `insert.block` `before` or `after` is not allowed in a one-line editor.\n */\n defineBehavior({\n on: 'insert.block',\n guard: ({event}) =>\n event.placement === 'before' || event.placement === 'after',\n actions: [() => [{type: 'noop'}]],\n }),\n /**\n * Other cases of `insert.block` are allowed.\n *\n * If a text block is inserted and the focus block is fully selected, then\n * the focus block can be replaced with the inserted block.\n */\n defineBehavior({\n on: 'insert.block',\n guard: ({context, event}) => {\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const selectionStartPoint = selectors.getSelectionStartPoint({context})\n const selectionEndPoint = selectors.getSelectionEndPoint({context})\n\n if (\n !focusTextBlock ||\n !utils.isTextBlock(context, event.block) ||\n !selectionStartPoint ||\n !selectionEndPoint\n ) {\n return false\n }\n\n const blockStartPoint = utils.getBlockStartPoint(focusTextBlock)\n const blockEndPoint = utils.getBlockEndPoint(focusTextBlock)\n const newFocus = utils.getBlockEndPoint({\n node: event.block,\n path: [{_key: event.block._key}],\n })\n\n if (\n utils.isEqualSelectionPoints(blockStartPoint, selectionStartPoint) &&\n utils.isEqualSelectionPoints(blockEndPoint, selectionEndPoint)\n ) {\n return {focusTextBlock, newFocus}\n }\n\n return false\n },\n actions: [\n ({event}, {focusTextBlock, newFocus}) => [\n {type: 'delete.block', blockPath: focusTextBlock.path},\n {type: 'insert.block', block: event.block, placement: 'auto'},\n {\n type: 'select',\n selection: {\n anchor: newFocus,\n focus: newFocus,\n },\n },\n ],\n ],\n }),\n /**\n * An ordinary `insert.block` is acceptable if it's a text block. In that\n * case it will get merged into the existing text block.\n */\n defineBehavior({\n on: 'insert.block',\n guard: ({context, event}) => {\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const selectionStartPoint = selectors.getSelectionStartPoint({context})\n const selectionEndPoint = selectors.getSelectionEndPoint({context})\n\n if (\n !focusTextBlock ||\n !utils.isTextBlock(context, event.block) ||\n !selectionStartPoint ||\n !selectionEndPoint\n ) {\n return false\n }\n\n const blockBeforeStartPoint = utils.splitTextBlock({\n context,\n block: focusTextBlock.node,\n point: selectionStartPoint,\n })?.before\n const blockAfterEndPoint = utils.splitTextBlock({\n context,\n block: focusTextBlock.node,\n point: selectionEndPoint,\n })?.after\n\n if (!blockBeforeStartPoint || !blockAfterEndPoint) {\n return false\n }\n\n const targetBlock = utils.mergeTextBlocks({\n context,\n targetBlock: blockBeforeStartPoint,\n incomingBlock: event.block,\n })\n\n const newFocus = utils.getBlockEndPoint({\n node: targetBlock,\n path: [{_key: targetBlock._key}],\n })\n\n const mergedBlock = utils.mergeTextBlocks({\n context,\n targetBlock,\n incomingBlock: blockAfterEndPoint,\n })\n\n return {focusTextBlock, mergedBlock, newFocus}\n },\n actions: [\n (_, {focusTextBlock, mergedBlock, newFocus}) => [\n {type: 'delete.block', blockPath: focusTextBlock.path},\n {type: 'insert.block', block: mergedBlock, placement: 'auto'},\n {\n type: 'select',\n selection: {\n anchor: newFocus,\n focus: newFocus,\n },\n },\n ],\n ],\n }),\n /**\n * Fallback Behavior to avoid `insert.block` in case the Behaviors above all\n * end up with a falsy guard.\n */\n defineBehavior({\n on: 'insert.block',\n actions: [() => [{type: 'noop'}]],\n }),\n /**\n * If multiple blocks are inserted, then the non-text blocks are filtered out\n * and the text blocks are merged into one block\n */\n defineBehavior({\n on: 'insert.blocks',\n guard: ({context, event}) => {\n return event.blocks\n .filter((block) => utils.isTextBlock(context, block))\n .reduce((targetBlock, incomingBlock) => {\n return utils.mergeTextBlocks({\n context,\n targetBlock,\n incomingBlock,\n })\n })\n },\n actions: [\n // `insert.block` is raised so the Behavior above can handle the\n // insertion\n (_, block) => [raise({type: 'insert.block', block, placement: 'auto'})],\n ],\n }),\n /**\n * Block objects do not fit in a one-line editor\n */\n defineBehavior({\n on: 'insert.block object',\n actions: [() => [{type: 'noop'}]],\n }),\n /**\n * `insert.text block` is raised as an `insert.block` so it can be handled\n * by the Behaviors above.\n */\n defineBehavior({\n on: 'insert.text block',\n actions: [\n ({context, event}) => [\n raise({\n type: 'insert.block',\n block: {\n _key: context.keyGenerator(),\n _type: context.schema.block.name,\n children: event.textBlock?.children ?? [],\n },\n placement: event.placement,\n }),\n ],\n ],\n }),\n]\n\n/**\n * @beta\n * Restrict the editor to one line. The plugin takes care of blocking\n * `insert.break` events and smart handling of other `insert.*` events.\n *\n * Place it with as high priority as possible to make sure other plugins don't\n * overwrite `insert.*` events before this plugin gets a chance to do so.\n */\nexport function OneLinePlugin() {\n return <BehaviorPlugin behaviors={oneLineBehaviors} />\n}\n"],"names":["BehaviorPlugin","props","$","_c","editor","useEditor","t0","t1","behaviors","unregisterBehaviors","map","behavior","registerBehavior","forEach","_temp","useEffect","unregister","EditorRefPlugin","React","forwardRef","_","ref","portableTextEditorRef","useRef","Symbol","for","current","useImperativeHandle","displayName","asteriskPairRegex","underscorePairRegex","italicRegex","RegExp","doubleAsteriskPairRegex","doubleUnderscorePairRegex","boldRegex","getTextToItalic","text","match","at","getTextToBold","useMarkdownEmphasisBehaviors","config","boldDecorator","schema","getSnapshot","context","italicDecorator","t2","input","useActorRef","emphasisMachine","emphasisListener","sendBack","defineBehavior","on","guard","event","undefined","focusTextBlock","selectors","selectionStartPoint","selectionStartOffset","utils","value","selectionPoint","textBefore","textToItalic","prefixOffsets","anchor","path","offset","length","focus","suffixOffsets","blockOffset","direction","decorator","selection","textToBold","actions","type","effect","selectionListenerCallback","blockOffsets","deleteBackwardListenerCallback","setup","types","events","actors","fromCallback","createMachine","id","initial","states","invoke","src","target","assign","offsetAfterEmphasis","exit","isEqual","MarkdownPlugin","createMarkdownBehaviors","unregisterBehavior","oneLineBehaviors","placement","selectionEndPoint","block","blockStartPoint","blockEndPoint","newFocus","node","_key","blockPath","blockBeforeStartPoint","point","before","blockAfterEndPoint","after","targetBlock","incomingBlock","mergedBlock","blocks","filter","reduce","raise","keyGenerator","_type","name","children","textBlock","OneLinePlugin","jsx"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../src/plugins/plugin.behavior.tsx","../../src/plugins/plugin.editor-ref.tsx","../../src/internal-utils/get-text-to-emphasize.ts","../../src/behaviors/behavior.markdown-emphasis.ts","../../src/plugins/plugin.markdown.tsx","../../src/plugins/plugin.one-line.tsx"],"sourcesContent":["import {useEffect} from 'react'\nimport type {Behavior} from '../behaviors'\nimport {useEditor} from '../editor/editor-provider'\n\n/**\n * @beta\n */\nexport function BehaviorPlugin(props: {behaviors: Array<Behavior>}) {\n const editor = useEditor()\n\n useEffect(() => {\n const unregisterBehaviors = props.behaviors.map((behavior) =>\n editor.registerBehavior({behavior}),\n )\n\n return () => {\n unregisterBehaviors.forEach((unregister) => unregister())\n }\n }, [editor, props.behaviors])\n\n return null\n}\n","import React from 'react'\nimport type {Editor} from '../editor/create-editor'\nimport {useEditor} from '../editor/editor-provider'\n\n/**\n * @beta\n */\nexport const EditorRefPlugin = React.forwardRef<Editor | null>((_, ref) => {\n const editor = useEditor()\n\n const portableTextEditorRef = React.useRef(editor)\n\n React.useImperativeHandle(ref, () => portableTextEditorRef.current, [])\n\n return null\n})\nEditorRefPlugin.displayName = 'EditorRefPlugin'\n","const asteriskPairRegex = '(?<!\\\\*)\\\\*(?!\\\\s)([^*\\\\n]+?)(?<!\\\\s)\\\\*(?!\\\\*)'\nconst underscorePairRegex = '(?<!_)_(?!\\\\s)([^_\\\\n]+?)(?<!\\\\s)_(?!_)'\nconst italicRegex = new RegExp(`(${asteriskPairRegex}|${underscorePairRegex})$`)\n\nconst doubleAsteriskPairRegex =\n '(?<!\\\\*)\\\\*\\\\*(?!\\\\s)([^*\\\\n]+?)(?<!\\\\s)\\\\*\\\\*(?!\\\\*)'\nconst doubleUnderscorePairRegex = '(?<!_)__(?!\\\\s)([^_\\\\n]+?)(?<!\\\\s)__(?!_)'\nconst boldRegex = new RegExp(\n `(${doubleAsteriskPairRegex}|${doubleUnderscorePairRegex})$`,\n)\n\nexport function getTextToItalic(text: string) {\n return text.match(italicRegex)?.at(0)\n}\n\nexport function getTextToBold(text: string) {\n return text.match(boldRegex)?.at(0)\n}\n","import {useActorRef} from '@xstate/react'\nimport {isEqual} from 'lodash'\nimport {\n assign,\n fromCallback,\n setup,\n type AnyEventObject,\n type CallbackLogicFunction,\n} from 'xstate'\nimport type {Editor} from '../editor/create-editor'\nimport {useEditor} from '../editor/editor-provider'\nimport {\n getTextToBold,\n getTextToItalic,\n} from '../internal-utils/get-text-to-emphasize'\nimport type {EditorSchema} from '../selectors'\nimport * as selectors from '../selectors'\nimport * as utils from '../utils'\nimport {defineBehavior} from './behavior.types'\n\n/**\n * @beta\n */\nexport type MarkdownEmphasisBehaviorsConfig = {\n boldDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n italicDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n}\n\n/**\n * @beta\n */\nexport function useMarkdownEmphasisBehaviors(props: {\n config: MarkdownEmphasisBehaviorsConfig\n}) {\n const editor = useEditor()\n\n useActorRef(emphasisMachine, {\n input: {\n editor,\n boldDecorator: props.config.boldDecorator?.({\n schema: editor.getSnapshot().context.schema,\n }),\n italicDecorator: props.config.italicDecorator?.({\n schema: editor.getSnapshot().context.schema,\n }),\n },\n })\n}\n\ntype MarkdownEmphasisEvent =\n | {\n type: 'emphasis.add'\n blockOffset: utils.BlockOffset\n }\n | {\n type: 'selection'\n blockOffsets?: {\n anchor: utils.BlockOffset\n focus: utils.BlockOffset\n }\n }\n | {\n type: 'delete.backward'\n }\n\nconst emphasisListener: CallbackLogicFunction<\n AnyEventObject,\n MarkdownEmphasisEvent,\n {editor: Editor; boldDecorator?: string; italicDecorator?: string}\n> = ({sendBack, input}) => {\n const unregister = input.editor.registerBehavior({\n behavior: defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const boldDecorator = input.boldDecorator\n const italicDecorator = input.italicDecorator\n\n if (boldDecorator === undefined && italicDecorator === undefined) {\n return false\n }\n\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const selectionStartPoint = selectors.getSelectionStartPoint({context})\n const selectionStartOffset = selectionStartPoint\n ? utils.spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: selectionStartPoint,\n })\n : undefined\n\n if (!focusTextBlock || !selectionStartOffset) {\n return false\n }\n\n const textBefore = selectors.getBlockTextBefore({context})\n\n const textToItalic = getTextToItalic(`${textBefore}${event.text}`)\n\n if (textToItalic !== undefined && italicDecorator !== undefined) {\n const prefixOffsets = {\n anchor: {\n path: focusTextBlock.path,\n // Example: \"foo *bar*\".length - \"*bar*\".length = 4\n offset: `${textBefore}${event.text}`.length - textToItalic.length,\n },\n focus: {\n path: focusTextBlock.path,\n // Example: \"foo *bar*\".length - \"*bar*\".length + 1 = 5\n offset:\n `${textBefore}${event.text}`.length - textToItalic.length + 1,\n },\n }\n const suffixOffsets = {\n anchor: {\n path: focusTextBlock.path,\n // Example: \"foo *bar|\" (8) + \"*\".length - 1 = 8\n offset: selectionStartOffset.offset + event.text.length - 1,\n },\n focus: {\n path: focusTextBlock.path,\n // Example: \"foo *bar|\" (8) + \"*\".length = 9\n offset: selectionStartOffset.offset + event.text.length,\n },\n }\n\n return {\n prefixOffsets,\n suffixOffsets,\n decorator: italicDecorator,\n }\n }\n\n const textToBold = getTextToBold(`${textBefore}${event.text}`)\n\n if (textToBold !== undefined && boldDecorator !== undefined) {\n const prefixOffsets = {\n anchor: {\n path: focusTextBlock.path,\n // Example: \"foo **bar**\".length - \"**bar**\".length = 4\n offset: `${textBefore}${event.text}`.length - textToBold.length,\n },\n focus: {\n path: focusTextBlock.path,\n // Example: \"foo **bar**\".length - \"**bar**\".length + 2 = 6\n offset:\n `${textBefore}${event.text}`.length - textToBold.length + 2,\n },\n }\n\n const prefixSelection = utils.blockOffsetsToSelection({\n value: context.value,\n offsets: prefixOffsets,\n })\n const inlineObjectBeforePrefixFocus =\n selectors.getPreviousInlineObject({\n context: {\n ...context,\n selection: prefixSelection\n ? {\n anchor: prefixSelection.focus,\n focus: prefixSelection.focus,\n }\n : null,\n },\n })\n const inlineObjectBeforePrefixFocusOffset =\n inlineObjectBeforePrefixFocus\n ? utils.childSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: inlineObjectBeforePrefixFocus.path,\n offset: 0,\n },\n })\n : undefined\n\n if (\n inlineObjectBeforePrefixFocusOffset &&\n inlineObjectBeforePrefixFocusOffset.offset >\n prefixOffsets.anchor.offset &&\n inlineObjectBeforePrefixFocusOffset.offset <\n prefixOffsets.focus.offset\n ) {\n return false\n }\n\n const suffixOffsets = {\n anchor: {\n path: focusTextBlock.path,\n // Example: \"foo **bar*|\" (10) + \"*\".length - 2 = 9\n offset: selectionStartOffset.offset + event.text.length - 2,\n },\n focus: {\n path: focusTextBlock.path,\n // Example: \"foo **bar*|\" (10) + \"*\".length = 11\n offset: selectionStartOffset.offset + event.text.length,\n },\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject({\n context,\n })\n const previousInlineObjectOffset = previousInlineObject\n ? utils.childSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: previousInlineObject.path,\n offset: 0,\n },\n })\n : undefined\n\n if (\n previousInlineObjectOffset &&\n previousInlineObjectOffset.offset > suffixOffsets.anchor.offset &&\n previousInlineObjectOffset.offset < suffixOffsets.focus.offset\n ) {\n return false\n }\n\n return {\n prefixOffsets,\n suffixOffsets,\n decorator: boldDecorator,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [event],\n (_, {prefixOffsets, suffixOffsets, decorator}) => [\n {\n type: 'decorator.add',\n decorator,\n offsets: {\n anchor: prefixOffsets.focus,\n focus: suffixOffsets.anchor,\n },\n },\n {\n type: 'delete.text',\n ...suffixOffsets,\n },\n {\n type: 'delete.text',\n ...prefixOffsets,\n },\n {\n type: 'decorator.remove',\n decorator,\n },\n {\n type: 'effect',\n effect: () => {\n sendBack({\n type: 'emphasis.add',\n blockOffset: {\n ...suffixOffsets.anchor,\n offset:\n suffixOffsets.anchor.offset -\n (prefixOffsets.focus.offset - prefixOffsets.anchor.offset),\n },\n })\n },\n },\n ],\n ],\n }),\n })\n\n return unregister\n}\n\nconst selectionListenerCallback: CallbackLogicFunction<\n AnyEventObject,\n MarkdownEmphasisEvent,\n {editor: Editor}\n> = ({sendBack, input}) => {\n const unregister = input.editor.registerBehavior({\n behavior: defineBehavior({\n on: 'select',\n guard: ({context, event}) => {\n if (!event.selection) {\n return {blockOffsets: undefined}\n }\n\n const anchor = utils.spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: event.selection.anchor,\n })\n const focus = utils.spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: event.selection.focus,\n })\n\n if (!anchor || !focus) {\n return {blockOffsets: undefined}\n }\n\n return {\n blockOffsets: {\n anchor,\n focus,\n },\n }\n },\n actions: [\n (_, {blockOffsets}) => [\n {\n type: 'effect',\n effect: () => {\n sendBack({type: 'selection', blockOffsets})\n },\n },\n ],\n ],\n }),\n })\n\n return unregister\n}\n\nconst deleteBackwardListenerCallback: CallbackLogicFunction<\n AnyEventObject,\n MarkdownEmphasisEvent,\n {editor: Editor}\n> = ({sendBack, input}) => {\n const unregister = input.editor.registerBehavior({\n behavior: defineBehavior({\n on: 'delete.backward',\n actions: [\n () => [\n {\n type: 'history.undo',\n },\n {\n type: 'effect',\n effect: () => {\n sendBack({type: 'delete.backward'})\n },\n },\n ],\n ],\n }),\n })\n\n return unregister\n}\n\nconst emphasisMachine = setup({\n types: {\n context: {} as {\n boldDecorator?: string\n italicDecorator?: string\n offsetAfterEmphasis?: utils.BlockOffset\n editor: Editor\n },\n input: {} as {\n boldDecorator?: string\n italicDecorator?: string\n editor: Editor\n },\n events: {} as MarkdownEmphasisEvent,\n },\n actors: {\n 'emphasis listener': fromCallback(emphasisListener),\n 'delete.backward listener': fromCallback(deleteBackwardListenerCallback),\n 'selection listener': fromCallback(selectionListenerCallback),\n },\n}).createMachine({\n id: 'emphasis',\n context: ({input}) => ({\n boldDecorator: input.boldDecorator,\n italicDecorator: input.italicDecorator,\n editor: input.editor,\n }),\n initial: 'idle',\n states: {\n 'idle': {\n invoke: [\n {\n src: 'emphasis listener',\n input: ({context}) => ({\n editor: context.editor,\n boldDecorator: context.boldDecorator,\n italicDecorator: context.italicDecorator,\n }),\n },\n ],\n on: {\n 'emphasis.add': {\n target: 'emphasis added',\n actions: assign({\n offsetAfterEmphasis: ({event}) => event.blockOffset,\n }),\n },\n },\n },\n 'emphasis added': {\n exit: [\n assign({\n offsetAfterEmphasis: undefined,\n }),\n ],\n invoke: [\n {\n src: 'selection listener',\n input: ({context}) => ({editor: context.editor}),\n },\n {\n src: 'delete.backward listener',\n input: ({context}) => ({editor: context.editor}),\n },\n ],\n on: {\n 'selection': {\n target: 'idle',\n guard: ({context, event}) => {\n const selectionChanged = !isEqual(\n {\n anchor: context.offsetAfterEmphasis,\n focus: context.offsetAfterEmphasis,\n },\n event.blockOffsets,\n )\n\n return selectionChanged\n },\n },\n 'delete.backward': {\n target: 'idle',\n },\n },\n },\n },\n})\n","import {useEffect} from 'react'\nimport {\n createMarkdownBehaviors,\n type MarkdownBehaviorsConfig,\n} from '../behaviors/behavior.markdown'\nimport {\n useMarkdownEmphasisBehaviors,\n type MarkdownEmphasisBehaviorsConfig,\n} from '../behaviors/behavior.markdown-emphasis'\nimport {useEditor} from '../editor/editor-provider'\n\n/**\n * @beta\n */\nexport type MarkdownPluginConfig = MarkdownBehaviorsConfig &\n MarkdownEmphasisBehaviorsConfig\n\n/**\n * @beta\n * Add markdown behaviors for common markdown actions such as converting ### to headings, --- to HRs, and more.\n *\n * @example\n * Configure the bundled markdown behaviors\n * ```ts\n * import {EditorProvider} from '@portabletext/editor'\n * import {MarkdownPlugin} from '@portabletext/editor/plugins'\n *\n * function App() {\n * return (\n * <EditorProvider>\n * <MarkdownPlugin\n * config={{\n * boldDecorator: ({schema}) =>\n * schema.decorators.find((decorator) => decorator.value === 'strong')?.value,\n * italicDecorator: ({schema}) =>\n * schema.decorators.find((decorator) => decorator.value === 'em')?.value,\n * horizontalRuleObject: ({schema}) => {\n * const name = schema.blockObjects.find(\n * (object) => object.name === 'break',\n * )?.name\n * return name ? {name} : undefined\n * },\n * defaultStyle: ({schema}) => schema.styles[0].value,\n * headingStyle: ({schema, level}) =>\n * schema.styles.find((style) => style.value === `h${level}`)\n * ?.value,\n * blockquoteStyle: ({schema}) =>\n * schema.styles.find((style) => style.value === 'blockquote')\n * ?.value,\n * unorderedListStyle: ({schema}) =>\n * schema.lists.find((list) => list.value === 'bullet')?.value,\n * orderedListStyle: ({schema}) =>\n * schema.lists.find((list) => list.value === 'number')?.value,\n * }}\n * />\n * {...}\n * </EditorProvider>\n * )\n * }\n */\nexport function MarkdownPlugin(props: {config: MarkdownPluginConfig}) {\n const editor = useEditor()\n useMarkdownEmphasisBehaviors({config: props.config})\n\n useEffect(() => {\n const behaviors = createMarkdownBehaviors(props.config)\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 }, [editor, props.config])\n\n return null\n}\n","import {defineBehavior, raise} from '../behaviors'\nimport * as selectors from '../selectors'\nimport * as utils from '../utils'\nimport {BehaviorPlugin} from './plugin.behavior'\n\nconst oneLineBehaviors = [\n /**\n * Hitting Enter on an expanded selection should just delete that selection\n * without causing a line break.\n */\n defineBehavior({\n on: 'insert.break',\n guard: ({context}) =>\n context.selection && selectors.isSelectionExpanded({context})\n ? {selection: context.selection}\n : false,\n actions: [(_, {selection}) => [{type: 'delete', selection}]],\n }),\n /**\n * All other cases of `insert.break` should be aborted.\n */\n defineBehavior({\n on: 'insert.break',\n actions: [() => [{type: 'noop'}]],\n }),\n /**\n * `insert.block` `before` or `after` is not allowed in a one-line editor.\n */\n defineBehavior({\n on: 'insert.block',\n guard: ({event}) =>\n event.placement === 'before' || event.placement === 'after',\n actions: [() => [{type: 'noop'}]],\n }),\n /**\n * Other cases of `insert.block` are allowed.\n *\n * If a text block is inserted and the focus block is fully selected, then\n * the focus block can be replaced with the inserted block.\n */\n defineBehavior({\n on: 'insert.block',\n guard: ({context, event}) => {\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const selectionStartPoint = selectors.getSelectionStartPoint({context})\n const selectionEndPoint = selectors.getSelectionEndPoint({context})\n\n if (\n !focusTextBlock ||\n !utils.isTextBlock(context, event.block) ||\n !selectionStartPoint ||\n !selectionEndPoint\n ) {\n return false\n }\n\n const blockStartPoint = utils.getBlockStartPoint(focusTextBlock)\n const blockEndPoint = utils.getBlockEndPoint(focusTextBlock)\n const newFocus = utils.getBlockEndPoint({\n node: event.block,\n path: [{_key: event.block._key}],\n })\n\n if (\n utils.isEqualSelectionPoints(blockStartPoint, selectionStartPoint) &&\n utils.isEqualSelectionPoints(blockEndPoint, selectionEndPoint)\n ) {\n return {focusTextBlock, newFocus}\n }\n\n return false\n },\n actions: [\n ({event}, {focusTextBlock, newFocus}) => [\n {type: 'delete.block', blockPath: focusTextBlock.path},\n {type: 'insert.block', block: event.block, placement: 'auto'},\n {\n type: 'select',\n selection: {\n anchor: newFocus,\n focus: newFocus,\n },\n },\n ],\n ],\n }),\n /**\n * An ordinary `insert.block` is acceptable if it's a text block. In that\n * case it will get merged into the existing text block.\n */\n defineBehavior({\n on: 'insert.block',\n guard: ({context, event}) => {\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const selectionStartPoint = selectors.getSelectionStartPoint({context})\n const selectionEndPoint = selectors.getSelectionEndPoint({context})\n\n if (\n !focusTextBlock ||\n !utils.isTextBlock(context, event.block) ||\n !selectionStartPoint ||\n !selectionEndPoint\n ) {\n return false\n }\n\n const blockBeforeStartPoint = utils.splitTextBlock({\n context,\n block: focusTextBlock.node,\n point: selectionStartPoint,\n })?.before\n const blockAfterEndPoint = utils.splitTextBlock({\n context,\n block: focusTextBlock.node,\n point: selectionEndPoint,\n })?.after\n\n if (!blockBeforeStartPoint || !blockAfterEndPoint) {\n return false\n }\n\n const targetBlock = utils.mergeTextBlocks({\n context,\n targetBlock: blockBeforeStartPoint,\n incomingBlock: event.block,\n })\n\n const newFocus = utils.getBlockEndPoint({\n node: targetBlock,\n path: [{_key: targetBlock._key}],\n })\n\n const mergedBlock = utils.mergeTextBlocks({\n context,\n targetBlock,\n incomingBlock: blockAfterEndPoint,\n })\n\n return {focusTextBlock, mergedBlock, newFocus}\n },\n actions: [\n (_, {focusTextBlock, mergedBlock, newFocus}) => [\n {type: 'delete.block', blockPath: focusTextBlock.path},\n {type: 'insert.block', block: mergedBlock, placement: 'auto'},\n {\n type: 'select',\n selection: {\n anchor: newFocus,\n focus: newFocus,\n },\n },\n ],\n ],\n }),\n /**\n * Fallback Behavior to avoid `insert.block` in case the Behaviors above all\n * end up with a falsy guard.\n */\n defineBehavior({\n on: 'insert.block',\n actions: [() => [{type: 'noop'}]],\n }),\n /**\n * If multiple blocks are inserted, then the non-text blocks are filtered out\n * and the text blocks are merged into one block\n */\n defineBehavior({\n on: 'insert.blocks',\n guard: ({context, event}) => {\n return event.blocks\n .filter((block) => utils.isTextBlock(context, block))\n .reduce((targetBlock, incomingBlock) => {\n return utils.mergeTextBlocks({\n context,\n targetBlock,\n incomingBlock,\n })\n })\n },\n actions: [\n // `insert.block` is raised so the Behavior above can handle the\n // insertion\n (_, block) => [raise({type: 'insert.block', block, placement: 'auto'})],\n ],\n }),\n /**\n * Block objects do not fit in a one-line editor\n */\n defineBehavior({\n on: 'insert.block object',\n actions: [() => [{type: 'noop'}]],\n }),\n /**\n * `insert.text block` is raised as an `insert.block` so it can be handled\n * by the Behaviors above.\n */\n defineBehavior({\n on: 'insert.text block',\n actions: [\n ({context, event}) => [\n raise({\n type: 'insert.block',\n block: {\n _key: context.keyGenerator(),\n _type: context.schema.block.name,\n children: event.textBlock?.children ?? [],\n },\n placement: event.placement,\n }),\n ],\n ],\n }),\n]\n\n/**\n * @beta\n * Restrict the editor to one line. The plugin takes care of blocking\n * `insert.break` events and smart handling of other `insert.*` events.\n *\n * Place it with as high priority as possible to make sure other plugins don't\n * overwrite `insert.*` events before this plugin gets a chance to do so.\n */\nexport function OneLinePlugin() {\n return <BehaviorPlugin behaviors={oneLineBehaviors} />\n}\n"],"names":["BehaviorPlugin","props","$","_c","editor","useEditor","t0","t1","behaviors","unregisterBehaviors","map","behavior","registerBehavior","forEach","_temp","useEffect","unregister","EditorRefPlugin","React","forwardRef","_","ref","portableTextEditorRef","useRef","Symbol","for","current","useImperativeHandle","displayName","asteriskPairRegex","underscorePairRegex","italicRegex","RegExp","doubleAsteriskPairRegex","doubleUnderscorePairRegex","boldRegex","getTextToItalic","text","match","at","getTextToBold","useMarkdownEmphasisBehaviors","config","boldDecorator","schema","getSnapshot","context","italicDecorator","t2","input","useActorRef","emphasisMachine","emphasisListener","sendBack","defineBehavior","on","guard","event","undefined","focusTextBlock","selectors","selectionStartPoint","selectionStartOffset","utils","value","selectionPoint","textBefore","textToItalic","prefixOffsets","anchor","path","offset","length","focus","suffixOffsets","decorator","textToBold","prefixSelection","offsets","inlineObjectBeforePrefixFocus","selection","inlineObjectBeforePrefixFocusOffset","previousInlineObject","previousInlineObjectOffset","actions","type","effect","blockOffset","selectionListenerCallback","blockOffsets","deleteBackwardListenerCallback","setup","types","events","actors","fromCallback","createMachine","id","initial","states","invoke","src","target","assign","offsetAfterEmphasis","exit","isEqual","MarkdownPlugin","createMarkdownBehaviors","unregisterBehavior","oneLineBehaviors","placement","selectionEndPoint","block","blockStartPoint","blockEndPoint","newFocus","node","_key","blockPath","blockBeforeStartPoint","point","before","blockAfterEndPoint","after","targetBlock","incomingBlock","mergedBlock","blocks","filter","reduce","raise","keyGenerator","_type","name","children","textBlock","OneLinePlugin","jsx"],"mappings":"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"}