@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.
- package/lib/_chunks-cjs/behavior.core.cjs +14 -8
- package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
- package/lib/_chunks-cjs/behavior.markdown.cjs +20 -12
- package/lib/_chunks-cjs/behavior.markdown.cjs.map +1 -1
- package/lib/_chunks-cjs/plugin.event-listener.cjs +95 -70
- package/lib/_chunks-cjs/plugin.event-listener.cjs.map +1 -1
- package/lib/_chunks-cjs/util.block-offsets-to-selection.cjs +103 -46
- package/lib/_chunks-cjs/util.block-offsets-to-selection.cjs.map +1 -1
- package/lib/_chunks-es/behavior.core.js +14 -8
- package/lib/_chunks-es/behavior.core.js.map +1 -1
- package/lib/_chunks-es/behavior.markdown.js +20 -12
- package/lib/_chunks-es/behavior.markdown.js.map +1 -1
- package/lib/_chunks-es/plugin.event-listener.js +101 -75
- package/lib/_chunks-es/plugin.event-listener.js.map +1 -1
- package/lib/_chunks-es/util.block-offsets-to-selection.js +102 -46
- package/lib/_chunks-es/util.block-offsets-to-selection.js.map +1 -1
- package/lib/behaviors/index.d.cts +5 -34
- package/lib/behaviors/index.d.ts +5 -34
- package/lib/index.d.cts +300 -1460
- package/lib/index.d.ts +300 -1460
- package/lib/plugins/index.cjs +60 -43
- package/lib/plugins/index.cjs.map +1 -1
- package/lib/plugins/index.d.cts +300 -1460
- package/lib/plugins/index.d.ts +300 -1460
- package/lib/plugins/index.js +63 -45
- package/lib/plugins/index.js.map +1 -1
- package/lib/selectors/index.d.cts +12 -0
- package/lib/selectors/index.d.ts +12 -0
- package/lib/utils/index.cjs +23 -1
- package/lib/utils/index.cjs.map +1 -1
- package/lib/utils/index.d.cts +11 -0
- package/lib/utils/index.d.ts +11 -0
- package/lib/utils/index.js +25 -2
- package/lib/utils/index.js.map +1 -1
- package/package.json +6 -6
- package/src/behavior-actions/behavior.action.block.set.ts +48 -5
- package/src/behavior-actions/behavior.action.block.unset.ts +77 -3
- package/src/behavior-actions/behavior.action.decorator.add.ts +30 -8
- package/src/behavior-actions/behavior.actions.ts +1 -18
- package/src/behaviors/behavior.core.lists.ts +18 -14
- package/src/behaviors/behavior.markdown-emphasis.ts +82 -41
- package/src/behaviors/behavior.markdown.ts +14 -12
- package/src/behaviors/behavior.types.ts +2 -14
- package/src/converters/converter.portable-text.deserialize.test.ts +3 -2
- package/src/internal-utils/parse-blocks.test.ts +455 -0
- package/src/internal-utils/parse-blocks.ts +202 -87
- package/src/utils/index.ts +1 -0
- package/src/utils/util.child-selection-point-to-block-offset.ts +55 -0
- package/src/behavior-actions/behavior.action.text-block.set.ts +0 -25
- package/src/behavior-actions/behavior.action.text-block.unset.ts +0 -17
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"behavior.markdown.js","sources":["../../src/behaviors/behavior.markdown.ts"],"sourcesContent":["import {isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSchema} from '../editor/define-schema'\nimport * as selectors from '../selectors'\nimport {getBlockTextBefore} from '../selectors/selector.get-text-before'\nimport {spanSelectionPointToBlockOffset} from '../utils/util.block-offset'\nimport {getTextBlockText} from '../utils/util.get-text-block-text'\nimport {defineBehavior} from './behavior.types'\n\n/**\n * @beta\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 unorderedListStyle?: (context: {schema: EditorSchema}) => string | undefined\n orderedListStyle?: (context: {schema: EditorSchema}) => string | undefined\n}\n\n/**\n * @beta\n * Create 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 {createMarkdownBehaviors, coreBehaviors} from '@portabletext/editor/behaviors'\n *\n * function App() {\n * return (\n * <EditorProvider\n * initialConfig={{\n * behaviors: [\n * ...coreBehaviors,\n * ...createMarkdownBehaviors({\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 * >\n * {...}\n * </EditorProvider>\n * )\n * }\n * ```\n *\n */\nexport function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {\n const automaticBlockquoteOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject({context})\n const blockOffset = spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: context.selection?.focus.offset ?? 0,\n },\n })\n\n if (previousInlineObject || !blockOffset) {\n return false\n }\n\n const blockText = getTextBlockText(focusTextBlock.node)\n const caretAtTheEndOfQuote = blockOffset.offset === 1\n const looksLikeMarkdownQuote = /^>/.test(blockText)\n const blockquoteStyle = config.blockquoteStyle?.(context)\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 {\n type: 'insert.text',\n text: ' ',\n },\n ],\n (_, {focusTextBlock, style}) => [\n {\n type: 'text block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n },\n {\n type: 'text block.set',\n style,\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\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 const automaticHr = defineBehavior({\n on: 'insert.text',\n guard: ({context, 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?.(context)\n const focusBlock = selectors.getFocusTextBlock({context})\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n\n if (!hrObject || !focusBlock || !selectionCollapsed) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject({context})\n const textBefore = getBlockTextBefore({context})\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 {\n type: 'insert.text',\n text: hrCharacter,\n },\n ],\n (_, {hrObject, hrBlockOffsets}) => [\n {\n type: 'insert.block object',\n placement: 'before',\n blockObject: hrObject,\n },\n {\n type: 'delete.text',\n ...hrBlockOffsets,\n },\n ],\n ],\n })\n const automaticHrOnPaste = defineBehavior({\n on: 'paste',\n guard: ({context, event}) => {\n const text = event.data.getData('text/plain')\n const hrRegExp = /^(---)$|(___)$|(\\*\\*\\*)$/gm\n const hrCharacters = text.match(hrRegExp)?.[0]\n const hrObject = config.horizontalRuleObject?.(context)\n const focusBlock = selectors.getFocusBlock({context})\n\n if (!hrCharacters || !hrObject || !focusBlock) {\n return false\n }\n\n return {hrCharacters, hrObject, focusBlock}\n },\n actions: [\n (_, {hrCharacters}) => [\n {\n type: 'insert.text',\n text: hrCharacters,\n },\n ],\n (_, {hrObject, focusBlock}) =>\n isPortableTextTextBlock(focusBlock.node)\n ? [\n {\n type: 'insert.text block',\n textBlock: {children: focusBlock.node.children},\n placement: 'after',\n },\n {\n type: 'insert.block object',\n blockObject: hrObject,\n placement: 'after',\n },\n {type: 'delete.block', blockPath: focusBlock.path},\n ]\n : [\n {\n type: 'insert.block object',\n blockObject: hrObject,\n placement: 'after',\n },\n ],\n ],\n })\n const automaticHeadingOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!blockOffset) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject({context})\n const blockText = 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: 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}) => [event],\n (_, {focusTextBlock, style, level}) => [\n {\n type: 'text block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n },\n {\n type: 'text block.set',\n style,\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\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 const clearStyleOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({context}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n context.selection?.focus.offset === 0\n\n const defaultStyle = config.defaultStyle?.(context)\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 {\n type: 'text block.set',\n style: defaultStyle,\n at: focusTextBlock.path,\n },\n ],\n ],\n })\n const automaticListOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject({context})\n const blockOffset = spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: context.selection?.focus.offset ?? 0,\n },\n })\n\n if (previousInlineObject || !blockOffset) {\n return false\n }\n\n const blockText = getTextBlockText(focusTextBlock.node)\n const defaultStyle = config.defaultStyle?.(context)\n const looksLikeUnorderedList = /^(-|\\*)/.test(blockText)\n const unorderedListStyle = config.unorderedListStyle?.(context)\n const caretAtTheEndOfUnorderedList = blockOffset.offset === 1\n\n if (\n defaultStyle &&\n caretAtTheEndOfUnorderedList &&\n looksLikeUnorderedList &&\n unorderedListStyle !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: unorderedListStyle,\n listItemLength: 1,\n style: defaultStyle,\n }\n }\n\n const looksLikeOrderedList = /^1\\./.test(blockText)\n const orderedListStyle = config.orderedListStyle?.(context)\n const caretAtTheEndOfOrderedList = blockOffset.offset === 2\n\n if (\n defaultStyle &&\n caretAtTheEndOfOrderedList &&\n looksLikeOrderedList &&\n orderedListStyle !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: orderedListStyle,\n listItemLength: 2,\n style: defaultStyle,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [event],\n (_, {focusTextBlock, style, listItem, listItemLength}) => [\n {\n type: 'text block.set',\n listItem,\n level: 1,\n style,\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\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 const markdownBehaviors = [\n automaticBlockquoteOnSpace,\n automaticHeadingOnSpace,\n automaticHr,\n automaticHrOnPaste,\n clearStyleOnBackspace,\n automaticListOnSpace,\n ]\n\n return markdownBehaviors\n}\n"],"names":["createMarkdownBehaviors","config","automaticBlockquoteOnSpace","defineBehavior","on","guard","context","event","text","selectionCollapsed","selectors","focusTextBlock","focusSpan","previousInlineObject","blockOffset","spanSelectionPointToBlockOffset","value","selectionPoint","path","_key","node","offset","selection","focus","blockText","getTextBlockText","caretAtTheEndOfQuote","looksLikeMarkdownQuote","test","blockquoteStyle","undefined","style","actions","type","_","props","at","anchor","automaticHr","hrCharacter","hrObject","horizontalRuleObject","focusBlock","textBefore","getBlockTextBefore","hrBlockOffsets","placement","blockObject","automaticHrOnPaste","data","getData","hrRegExp","hrCharacters","match","isPortableTextTextBlock","textBlock","children","blockPath","automaticHeadingOnSpace","markdownHeadingSearch","exec","level","length","caretAtTheEndOfHeading","headingStyle","schema","clearStyleOnBackspace","atTheBeginningOfBLock","defaultStyle","automaticListOnSpace","looksLikeUnorderedList","unorderedListStyle","caretAtTheEndOfUnorderedList","listItem","listItemLength","looksLikeOrderedList","orderedListStyle","caretAtTheEndOfOrderedList"],"mappings":";;;;;AAsEO,SAASA,wBAAwBC,QAAiC;AACvE,QAAMC,6BAA6BC,eAAe;AAAA,IAChDC,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAASC;AAAAA,IAAAA,MAAW;AAGvB,UAFYA,MAAMC,SAAS;AAGtB,eAAA;AAGHC,YAAAA,qBAAqBC,qBAA+B;AAAA,QAACJ;AAAAA,MAAAA,CAAQ,GAC7DK,iBAAiBD,kBAA4B;AAAA,QAACJ;AAAAA,MAAAA,CAAQ,GACtDM,YAAYF,aAAuB;AAAA,QAACJ;AAAAA,MAAAA,CAAQ;AAElD,UAAI,CAACG,sBAAsB,CAACE,kBAAkB,CAACC;AACtC,eAAA;AAGHC,YAAAA,uBAAuBH,wBAAkC;AAAA,QAACJ;AAAAA,MAAAA,CAAQ,GAClEQ,cAAcC,gCAAgC;AAAA,QAClDC,OAAOV,QAAQU;AAAAA,QACfC,gBAAgB;AAAA,UACdC,MAAM,CACJ;AAAA,YAACC,MAAMR,eAAeS,KAAKD;AAAAA,aAC3B,YACA;AAAA,YAACA,MAAMP,UAAUQ,KAAKD;AAAAA,UAAAA,CAAK;AAAA,UAE7BE,QAAQf,QAAQgB,WAAWC,MAAMF,UAAU;AAAA,QAAA;AAAA,MAC7C,CACD;AAED,UAAIR,wBAAwB,CAACC;AACpB,eAAA;AAGT,YAAMU,YAAYC,iBAAiBd,eAAeS,IAAI,GAChDM,uBAAuBZ,YAAYO,WAAW,GAC9CM,yBAAyB,KAAKC,KAAKJ,SAAS,GAC5CK,kBAAkB5B,OAAO4B,kBAAkBvB,OAAO;AAGtDoB,aAAAA,wBACAC,0BACAE,oBAAoBC,SAEb;AAAA,QAACnB;AAAAA,QAAgBoB,OAAOF;AAAAA,MAAAA,IAG1B;AAAA,IACT;AAAA,IACAG,SAAS,CACP,MAAM,CACJ;AAAA,MACEC,MAAM;AAAA,MACNzB,MAAM;AAAA,IAAA,CACP,GAEH,CAAC0B,GAAG;AAAA,MAACvB;AAAAA,MAAgBoB;AAAAA,IAAAA,MAAW,CAC9B;AAAA,MACEE,MAAM;AAAA,MACNE,OAAO,CAAC,YAAY,OAAO;AAAA,MAC3BC,IAAIzB,eAAeO;AAAAA,IAAAA,GAErB;AAAA,MACEe,MAAM;AAAA,MACNF;AAAAA,MACAK,IAAIzB,eAAeO;AAAAA,IAAAA,GAErB;AAAA,MACEe,MAAM;AAAA,MACNI,QAAQ;AAAA,QACNnB,MAAMP,eAAeO;AAAAA,QACrBG,QAAQ;AAAA,MACV;AAAA,MACAE,OAAO;AAAA,QACLL,MAAMP,eAAeO;AAAAA,QACrBG,QAAQ;AAAA,MAAA;AAAA,IACV,CACD,CACF;AAAA,EAAA,CAEJ,GACKiB,cAAcnC,eAAe;AAAA,IACjCC,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAASC;AAAAA,IAAAA,MAAW;AAC3B,YAAMgC,cACJhC,MAAMC,SAAS,MACX,MACAD,MAAMC,SAAS,MACb,MACAD,MAAMC,SAAS,MACb,MACAsB;AAEV,UAAIS,gBAAgBT;AACX,eAAA;AAGT,YAAMU,WAAWvC,OAAOwC,uBAAuBnC,OAAO,GAChDoC,aAAahC,kBAA4B;AAAA,QAACJ;AAAAA,MAAAA,CAAQ,GAClDG,qBAAqBC,qBAA+B;AAAA,QAACJ;AAAAA,MAAAA,CAAQ;AAEnE,UAAI,CAACkC,YAAY,CAACE,cAAc,CAACjC;AACxB,eAAA;AAGHI,YAAAA,uBAAuBH,wBAAkC;AAAA,QAACJ;AAAAA,MAAAA,CAAQ,GAClEqC,aAAaC,mBAAmB;AAAA,QAACtC;AAAAA,MAAQ,CAAA,GACzCuC,iBAAiB;AAAA,QACrBR,QAAQ;AAAA,UACNnB,MAAMwB,WAAWxB;AAAAA,UACjBG,QAAQ;AAAA,QACV;AAAA,QACAE,OAAO;AAAA,UACLL,MAAMwB,WAAWxB;AAAAA,UACjBG,QAAQ;AAAA,QAAA;AAAA,MAEZ;AAEA,aACE,CAACR,wBACD8B,eAAe,GAAGJ,WAAW,GAAGA,WAAW,KAEpC;AAAA,QAACC;AAAAA,QAAUE;AAAAA,QAAYH;AAAAA,QAAaM;AAAAA,MAAAA,IAGtC;AAAA,IACT;AAAA,IACAb,SAAS,CACP,CAACE,GAAG;AAAA,MAACK;AAAAA,IAAAA,MAAiB,CACpB;AAAA,MACEN,MAAM;AAAA,MACNzB,MAAM+B;AAAAA,IAAAA,CACP,GAEH,CAACL,GAAG;AAAA,MAACM;AAAAA,MAAUK;AAAAA,IAAAA,MAAoB,CACjC;AAAA,MACEZ,MAAM;AAAA,MACNa,WAAW;AAAA,MACXC,aAAaP;AAAAA,IAAAA,GAEf;AAAA,MACEP,MAAM;AAAA,MACN,GAAGY;AAAAA,IAAAA,CACJ,CACF;AAAA,EAAA,CAEJ,GACKG,qBAAqB7C,eAAe;AAAA,IACxCC,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAASC;AAAAA,IAAAA,MAAW;AACrBC,YAAAA,OAAOD,MAAM0C,KAAKC,QAAQ,YAAY,GACtCC,WAAW,8BACXC,eAAe5C,KAAK6C,MAAMF,QAAQ,IAAI,CAAC,GACvCX,WAAWvC,OAAOwC,uBAAuBnC,OAAO,GAChDoC,aAAahC,cAAwB;AAAA,QAACJ;AAAAA,MAAAA,CAAQ;AAEpD,aAAI,CAAC8C,gBAAgB,CAACZ,YAAY,CAACE,aAC1B,KAGF;AAAA,QAACU;AAAAA,QAAcZ;AAAAA,QAAUE;AAAAA,MAAU;AAAA,IAC5C;AAAA,IACAV,SAAS,CACP,CAACE,GAAG;AAAA,MAACkB;AAAAA,IAAAA,MAAkB,CACrB;AAAA,MACEnB,MAAM;AAAA,MACNzB,MAAM4C;AAAAA,IAAAA,CACP,GAEH,CAAClB,GAAG;AAAA,MAACM;AAAAA,MAAUE;AAAAA,IACbY,MAAAA,wBAAwBZ,WAAWtB,IAAI,IACnC,CACE;AAAA,MACEa,MAAM;AAAA,MACNsB,WAAW;AAAA,QAACC,UAAUd,WAAWtB,KAAKoC;AAAAA,MAAQ;AAAA,MAC9CV,WAAW;AAAA,IAAA,GAEb;AAAA,MACEb,MAAM;AAAA,MACNc,aAAaP;AAAAA,MACbM,WAAW;AAAA,IAAA,GAEb;AAAA,MAACb,MAAM;AAAA,MAAgBwB,WAAWf,WAAWxB;AAAAA,IAAK,CAAA,IAEpD,CACE;AAAA,MACEe,MAAM;AAAA,MACNc,aAAaP;AAAAA,MACbM,WAAW;AAAA,IAAA,CACZ,CACF;AAAA,EAAA,CAEV,GACKY,0BAA0BvD,eAAe;AAAA,IAC7CC,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAASC;AAAAA,IAAAA,MAAW;AAGvB,UAFYA,MAAMC,SAAS;AAGtB,eAAA;AAGHC,YAAAA,qBAAqBC,qBAA+B;AAAA,QAACJ;AAAAA,MAAAA,CAAQ,GAC7DK,iBAAiBD,kBAA4B;AAAA,QAACJ;AAAAA,MAAAA,CAAQ,GACtDM,YAAYF,aAAuB;AAAA,QAACJ;AAAAA,MAAAA,CAAQ;AAElD,UAAI,CAACG,sBAAsB,CAACE,kBAAkB,CAACC;AACtC,eAAA;AAGT,YAAME,cAAcC,gCAAgC;AAAA,QAClDC,OAAOV,QAAQU;AAAAA,QACfC,gBAAgB;AAAA,UACdC,MAAM,CACJ;AAAA,YAACC,MAAMR,eAAeS,KAAKD;AAAAA,aAC3B,YACA;AAAA,YAACA,MAAMP,UAAUQ,KAAKD;AAAAA,UAAAA,CAAK;AAAA,UAE7BE,QAAQf,QAAQgB,WAAWC,MAAMF,UAAU;AAAA,QAAA;AAAA,MAC7C,CACD;AAED,UAAI,CAACP;AACI,eAAA;AAGHD,YAAAA,uBAAuBH,wBAAkC;AAAA,QAACJ;AAAAA,MAAAA,CAAQ,GAClEkB,YAAYC,iBAAiBd,eAAeS,IAAI,GAChDuC,wBAAwB,MAAMC,KAAKpC,SAAS,GAC5CqC,QAAQF,wBACVA,sBAAsB,CAAC,EAAEG,SACzBhC,QACEiC,yBAAyBjD,YAAYO,WAAWwC;AAEtD,UAAIhD,wBAAwB,CAACkD;AACpB,eAAA;AAGT,YAAMhC,QACJ8B,UAAU/B,SACN7B,OAAO+D,eAAe;AAAA,QAACC,QAAQ3D,QAAQ2D;AAAAA,QAAQJ;AAAAA,MAAM,CAAA,IACrD/B;AAEF+B,aAAAA,UAAU/B,UAAaC,UAAUD,SAC5B;AAAA,QACLnB;AAAAA,QACAoB;AAAAA,QACA8B;AAAAA,MAAAA,IAIG;AAAA,IACT;AAAA,IACA7B,SAAS,CACP,CAAC;AAAA,MAACzB;AAAAA,IAAAA,MAAW,CAACA,KAAK,GACnB,CAAC2B,GAAG;AAAA,MAACvB;AAAAA,MAAgBoB;AAAAA,MAAO8B;AAAAA,IAAAA,MAAW,CACrC;AAAA,MACE5B,MAAM;AAAA,MACNE,OAAO,CAAC,YAAY,OAAO;AAAA,MAC3BC,IAAIzB,eAAeO;AAAAA,IAAAA,GAErB;AAAA,MACEe,MAAM;AAAA,MACNF;AAAAA,MACAK,IAAIzB,eAAeO;AAAAA,IAAAA,GAErB;AAAA,MACEe,MAAM;AAAA,MACNI,QAAQ;AAAA,QACNnB,MAAMP,eAAeO;AAAAA,QACrBG,QAAQ;AAAA,MACV;AAAA,MACAE,OAAO;AAAA,QACLL,MAAMP,eAAeO;AAAAA,QACrBG,QAAQwC,QAAQ;AAAA,MAAA;AAAA,IAClB,CACD,CACF;AAAA,EAAA,CAEJ,GACKK,wBAAwB/D,eAAe;AAAA,IAC3CC,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,IAAAA,MAAa;AACdG,YAAAA,qBAAqBC,qBAA+B;AAAA,QAACJ;AAAAA,MAAAA,CAAQ,GAC7DK,iBAAiBD,kBAA4B;AAAA,QAACJ;AAAAA,MAAAA,CAAQ,GACtDM,YAAYF,aAAuB;AAAA,QAACJ;AAAAA,MAAAA,CAAQ;AAElD,UAAI,CAACG,sBAAsB,CAACE,kBAAkB,CAACC;AACtC,eAAA;AAGT,YAAMuD,wBACJxD,eAAeS,KAAKoC,SAAS,CAAC,EAAErC,SAASP,UAAUQ,KAAKD,QACxDb,QAAQgB,WAAWC,MAAMF,WAAW,GAEhC+C,eAAenE,OAAOmE,eAAe9D,OAAO;AAElD,aACE6D,yBACAC,gBACAzD,eAAeS,KAAKW,UAAUqC,eAEvB;AAAA,QAACA;AAAAA,QAAczD;AAAAA,MAAAA,IAGjB;AAAA,IACT;AAAA,IACAqB,SAAS,CACP,CAACE,GAAG;AAAA,MAACkC;AAAAA,MAAczD;AAAAA,IAAAA,MAAoB,CACrC;AAAA,MACEsB,MAAM;AAAA,MACNF,OAAOqC;AAAAA,MACPhC,IAAIzB,eAAeO;AAAAA,IAAAA,CACpB,CACF;AAAA,EAAA,CAEJ,GACKmD,uBAAuBlE,eAAe;AAAA,IAC1CC,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAASC;AAAAA,IAAAA,MAAW;AAGvB,UAFYA,MAAMC,SAAS;AAGtB,eAAA;AAGHC,YAAAA,qBAAqBC,qBAA+B;AAAA,QAACJ;AAAAA,MAAAA,CAAQ,GAC7DK,iBAAiBD,kBAA4B;AAAA,QAACJ;AAAAA,MAAAA,CAAQ,GACtDM,YAAYF,aAAuB;AAAA,QAACJ;AAAAA,MAAAA,CAAQ;AAElD,UAAI,CAACG,sBAAsB,CAACE,kBAAkB,CAACC;AACtC,eAAA;AAGHC,YAAAA,uBAAuBH,wBAAkC;AAAA,QAACJ;AAAAA,MAAAA,CAAQ,GAClEQ,cAAcC,gCAAgC;AAAA,QAClDC,OAAOV,QAAQU;AAAAA,QACfC,gBAAgB;AAAA,UACdC,MAAM,CACJ;AAAA,YAACC,MAAMR,eAAeS,KAAKD;AAAAA,aAC3B,YACA;AAAA,YAACA,MAAMP,UAAUQ,KAAKD;AAAAA,UAAAA,CAAK;AAAA,UAE7BE,QAAQf,QAAQgB,WAAWC,MAAMF,UAAU;AAAA,QAAA;AAAA,MAC7C,CACD;AAED,UAAIR,wBAAwB,CAACC;AACpB,eAAA;AAGHU,YAAAA,YAAYC,iBAAiBd,eAAeS,IAAI,GAChDgD,eAAenE,OAAOmE,eAAe9D,OAAO,GAC5CgE,yBAAyB,UAAU1C,KAAKJ,SAAS,GACjD+C,qBAAqBtE,OAAOsE,qBAAqBjE,OAAO,GACxDkE,+BAA+B1D,YAAYO,WAAW;AAG1D+C,UAAAA,gBACAI,gCACAF,0BACAC,uBAAuBzC;AAEhB,eAAA;AAAA,UACLnB;AAAAA,UACA8D,UAAUF;AAAAA,UACVG,gBAAgB;AAAA,UAChB3C,OAAOqC;AAAAA,QACT;AAGF,YAAMO,uBAAuB,OAAO/C,KAAKJ,SAAS,GAC5CoD,mBAAmB3E,OAAO2E,mBAAmBtE,OAAO,GACpDuE,6BAA6B/D,YAAYO,WAAW;AAE1D,aACE+C,gBACAS,8BACAF,wBACAC,qBAAqB9C,SAEd;AAAA,QACLnB;AAAAA,QACA8D,UAAUG;AAAAA,QACVF,gBAAgB;AAAA,QAChB3C,OAAOqC;AAAAA,MAAAA,IAIJ;AAAA,IACT;AAAA,IACApC,SAAS,CACP,CAAC;AAAA,MAACzB;AAAAA,IAAAA,MAAW,CAACA,KAAK,GACnB,CAAC2B,GAAG;AAAA,MAACvB;AAAAA,MAAgBoB;AAAAA,MAAO0C;AAAAA,MAAUC;AAAAA,IAAAA,MAAoB,CACxD;AAAA,MACEzC,MAAM;AAAA,MACNwC;AAAAA,MACAZ,OAAO;AAAA,MACP9B;AAAAA,MACAK,IAAIzB,eAAeO;AAAAA,IAAAA,GAErB;AAAA,MACEe,MAAM;AAAA,MACNI,QAAQ;AAAA,QACNnB,MAAMP,eAAeO;AAAAA,QACrBG,QAAQ;AAAA,MACV;AAAA,MACAE,OAAO;AAAA,QACLL,MAAMP,eAAeO;AAAAA,QACrBG,QAAQqD,iBAAiB;AAAA,MAAA;AAAA,IAC3B,CACD,CACF;AAAA,EAAA,CAEJ;AAWD,SAT0B,CACxBxE,4BACAwD,yBACApB,aACAU,oBACAkB,uBACAG,oBAAoB;AAIxB;"}
|
|
1
|
+
{"version":3,"file":"behavior.markdown.js","sources":["../../src/behaviors/behavior.markdown.ts"],"sourcesContent":["import {isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSchema} from '../editor/define-schema'\nimport * as selectors from '../selectors'\nimport {getBlockTextBefore} from '../selectors/selector.get-text-before'\nimport {spanSelectionPointToBlockOffset} from '../utils/util.block-offset'\nimport {getTextBlockText} from '../utils/util.get-text-block-text'\nimport {defineBehavior} from './behavior.types'\n\n/**\n * @beta\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 unorderedListStyle?: (context: {schema: EditorSchema}) => string | undefined\n orderedListStyle?: (context: {schema: EditorSchema}) => string | undefined\n}\n\n/**\n * @beta\n * Create 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 {createMarkdownBehaviors, coreBehaviors} from '@portabletext/editor/behaviors'\n *\n * function App() {\n * return (\n * <EditorProvider\n * initialConfig={{\n * behaviors: [\n * ...coreBehaviors,\n * ...createMarkdownBehaviors({\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 * >\n * {...}\n * </EditorProvider>\n * )\n * }\n * ```\n *\n */\nexport function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {\n const automaticBlockquoteOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject({context})\n const blockOffset = spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: context.selection?.focus.offset ?? 0,\n },\n })\n\n if (previousInlineObject || !blockOffset) {\n return false\n }\n\n const blockText = getTextBlockText(focusTextBlock.node)\n const caretAtTheEndOfQuote = blockOffset.offset === 1\n const looksLikeMarkdownQuote = /^>/.test(blockText)\n const blockquoteStyle = config.blockquoteStyle?.(context)\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 {\n type: 'insert.text',\n text: ' ',\n },\n ],\n (_, {focusTextBlock, style}) => [\n {\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n },\n {\n type: 'block.set',\n props: {style},\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\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 const automaticHr = defineBehavior({\n on: 'insert.text',\n guard: ({context, 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?.(context)\n const focusBlock = selectors.getFocusTextBlock({context})\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n\n if (!hrObject || !focusBlock || !selectionCollapsed) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject({context})\n const textBefore = getBlockTextBefore({context})\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 {\n type: 'insert.text',\n text: hrCharacter,\n },\n ],\n (_, {hrObject, hrBlockOffsets}) => [\n {\n type: 'insert.block object',\n placement: 'before',\n blockObject: hrObject,\n },\n {\n type: 'delete.text',\n ...hrBlockOffsets,\n },\n ],\n ],\n })\n const automaticHrOnPaste = defineBehavior({\n on: 'paste',\n guard: ({context, event}) => {\n const text = event.data.getData('text/plain')\n const hrRegExp = /^(---)$|(___)$|(\\*\\*\\*)$/gm\n const hrCharacters = text.match(hrRegExp)?.[0]\n const hrObject = config.horizontalRuleObject?.(context)\n const focusBlock = selectors.getFocusBlock({context})\n\n if (!hrCharacters || !hrObject || !focusBlock) {\n return false\n }\n\n return {hrCharacters, hrObject, focusBlock}\n },\n actions: [\n (_, {hrCharacters}) => [\n {\n type: 'insert.text',\n text: hrCharacters,\n },\n ],\n (_, {hrObject, focusBlock}) =>\n isPortableTextTextBlock(focusBlock.node)\n ? [\n {\n type: 'insert.text block',\n textBlock: {children: focusBlock.node.children},\n placement: 'after',\n },\n {\n type: 'insert.block object',\n blockObject: hrObject,\n placement: 'after',\n },\n {type: 'delete.block', blockPath: focusBlock.path},\n ]\n : [\n {\n type: 'insert.block object',\n blockObject: hrObject,\n placement: 'after',\n },\n ],\n ],\n })\n const automaticHeadingOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!blockOffset) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject({context})\n const blockText = 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: 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}) => [event],\n (_, {focusTextBlock, style, level}) => [\n {\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n },\n {\n type: 'block.set',\n props: {style},\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\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 const clearStyleOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({context}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n context.selection?.focus.offset === 0\n\n const defaultStyle = config.defaultStyle?.(context)\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 {\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: ({context, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject({context})\n const blockOffset = spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: context.selection?.focus.offset ?? 0,\n },\n })\n\n if (previousInlineObject || !blockOffset) {\n return false\n }\n\n const blockText = getTextBlockText(focusTextBlock.node)\n const defaultStyle = config.defaultStyle?.(context)\n const looksLikeUnorderedList = /^(-|\\*)/.test(blockText)\n const unorderedListStyle = config.unorderedListStyle?.(context)\n const caretAtTheEndOfUnorderedList = blockOffset.offset === 1\n\n if (\n defaultStyle &&\n caretAtTheEndOfUnorderedList &&\n looksLikeUnorderedList &&\n unorderedListStyle !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: unorderedListStyle,\n listItemLength: 1,\n style: defaultStyle,\n }\n }\n\n const looksLikeOrderedList = /^1\\./.test(blockText)\n const orderedListStyle = config.orderedListStyle?.(context)\n const caretAtTheEndOfOrderedList = blockOffset.offset === 2\n\n if (\n defaultStyle &&\n caretAtTheEndOfOrderedList &&\n looksLikeOrderedList &&\n orderedListStyle !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: orderedListStyle,\n listItemLength: 2,\n style: defaultStyle,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [event],\n (_, {focusTextBlock, style, listItem, listItemLength}) => [\n {\n type: 'block.set',\n props: {\n listItem,\n level: 1,\n style,\n },\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\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 const markdownBehaviors = [\n automaticBlockquoteOnSpace,\n automaticHeadingOnSpace,\n automaticHr,\n automaticHrOnPaste,\n clearStyleOnBackspace,\n automaticListOnSpace,\n ]\n\n return markdownBehaviors\n}\n"],"names":["createMarkdownBehaviors","config","automaticBlockquoteOnSpace","defineBehavior","on","guard","context","event","text","selectionCollapsed","selectors","focusTextBlock","focusSpan","previousInlineObject","blockOffset","spanSelectionPointToBlockOffset","value","selectionPoint","path","_key","node","offset","selection","focus","blockText","getTextBlockText","caretAtTheEndOfQuote","looksLikeMarkdownQuote","test","blockquoteStyle","undefined","style","actions","type","_","props","at","anchor","automaticHr","hrCharacter","hrObject","horizontalRuleObject","focusBlock","textBefore","getBlockTextBefore","hrBlockOffsets","placement","blockObject","automaticHrOnPaste","data","getData","hrRegExp","hrCharacters","match","isPortableTextTextBlock","textBlock","children","blockPath","automaticHeadingOnSpace","markdownHeadingSearch","exec","level","length","caretAtTheEndOfHeading","headingStyle","schema","clearStyleOnBackspace","atTheBeginningOfBLock","defaultStyle","automaticListOnSpace","looksLikeUnorderedList","unorderedListStyle","caretAtTheEndOfUnorderedList","listItem","listItemLength","looksLikeOrderedList","orderedListStyle","caretAtTheEndOfOrderedList"],"mappings":"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"}
|
|
@@ -14,8 +14,8 @@ import flatten from "lodash/flatten.js";
|
|
|
14
14
|
import isPlainObject from "lodash/isPlainObject.js";
|
|
15
15
|
import uniq from "lodash/uniq.js";
|
|
16
16
|
import getRandomValues from "get-random-values-esm";
|
|
17
|
-
import { parseBlock, blockOffsetsToSelection } from "./util.block-offsets-to-selection.js";
|
|
18
|
-
import { sliceBlocks, spanSelectionPointToBlockOffset } from "./util.slice-blocks.js";
|
|
17
|
+
import { parseBlock, blockOffsetsToSelection, isTextBlock } from "./util.block-offsets-to-selection.js";
|
|
18
|
+
import { sliceBlocks, blockOffsetToSpanSelectionPoint, spanSelectionPointToBlockOffset } from "./util.slice-blocks.js";
|
|
19
19
|
import { htmlToBlocks } from "@portabletext/block-tools";
|
|
20
20
|
import { toHTML } from "@portabletext/to-html";
|
|
21
21
|
import { Schema } from "@sanity/schema";
|
|
@@ -24,6 +24,7 @@ import isUndefined from "lodash/isUndefined.js";
|
|
|
24
24
|
import omitBy from "lodash/omitBy.js";
|
|
25
25
|
import { createGuards } from "./selector.is-at-the-start-of-block.js";
|
|
26
26
|
import { getTrimmedSelection, isActiveAnnotation, isActiveDecorator, isActiveListItem, isActiveStyle } from "./selector.is-active-style.js";
|
|
27
|
+
import omit from "lodash/omit.js";
|
|
27
28
|
import startCase from "lodash.startcase";
|
|
28
29
|
import { defineBehavior, raise, coreBehaviors, isCustomBehaviorEvent } from "./behavior.core.js";
|
|
29
30
|
import { Subject } from "rxjs";
|
|
@@ -2537,13 +2538,13 @@ function createOperationToPatches(types) {
|
|
|
2537
2538
|
throw new Error(`Unexpected path encountered: ${JSON.stringify(operation.path)}`);
|
|
2538
2539
|
}
|
|
2539
2540
|
function insertNodePatch(editor, operation, beforeValue) {
|
|
2540
|
-
const block = beforeValue[operation.path[0]],
|
|
2541
|
+
const block = beforeValue[operation.path[0]], isTextBlock2 = editor.isTextBlock(block);
|
|
2541
2542
|
if (operation.path.length === 1) {
|
|
2542
2543
|
const position = operation.path[0] === 0 ? "before" : "after", beforeBlock = beforeValue[operation.path[0] - 1], targetKey = operation.path[0] === 0 ? block?._key : beforeBlock?._key;
|
|
2543
2544
|
return targetKey ? [insert([fromSlateValue([operation.node], textBlockName)[0]], position, [{
|
|
2544
2545
|
_key: targetKey
|
|
2545
2546
|
}])] : [setIfMissing(beforeValue, []), insert([fromSlateValue([operation.node], textBlockName)[0]], "before", [operation.path[0]])];
|
|
2546
|
-
} else if (
|
|
2547
|
+
} else if (isTextBlock2 && operation.path.length === 2 && editor.children[operation.path[0]]) {
|
|
2547
2548
|
const position = block.children.length === 0 || !block.children[operation.path[1] - 1] ? "before" : "after", node = {
|
|
2548
2549
|
...operation.node
|
|
2549
2550
|
};
|
|
@@ -2899,10 +2900,21 @@ const decoratorAddActionImplementation = ({
|
|
|
2899
2900
|
context,
|
|
2900
2901
|
action
|
|
2901
2902
|
}) => {
|
|
2902
|
-
const editor = action.editor, mark = action.decorator,
|
|
2903
|
+
const editor = action.editor, mark = action.decorator, value = fromSlateValue(editor.children, context.schema.block.name, KEY_TO_VALUE_ELEMENT.get(editor)), manualAnchor = action.offsets?.anchor ? blockOffsetToSpanSelectionPoint({
|
|
2904
|
+
value,
|
|
2905
|
+
blockOffset: action.offsets.anchor,
|
|
2906
|
+
direction: "backward"
|
|
2907
|
+
}) : void 0, manualFocus = action.offsets?.focus ? blockOffsetToSpanSelectionPoint({
|
|
2908
|
+
value,
|
|
2909
|
+
blockOffset: action.offsets.focus,
|
|
2910
|
+
direction: "forward"
|
|
2911
|
+
}) : void 0, manualSelection = manualAnchor && manualFocus ? {
|
|
2912
|
+
anchor: manualAnchor,
|
|
2913
|
+
focus: manualFocus
|
|
2914
|
+
} : void 0, selection = manualSelection ? toSlateRange(manualSelection, action.editor) ?? editor.selection : editor.selection;
|
|
2903
2915
|
if (!selection)
|
|
2904
2916
|
return;
|
|
2905
|
-
const
|
|
2917
|
+
const editorSelection = toPortableTextRange(value, selection, context.schema), anchorOffset = editorSelection ? spanSelectionPointToBlockOffset({
|
|
2906
2918
|
value,
|
|
2907
2919
|
selectionPoint: editorSelection.anchor
|
|
2908
2920
|
}) : void 0, focusOffset = editorSelection ? spanSelectionPointToBlockOffset({
|
|
@@ -4005,6 +4017,7 @@ function insertBlock({
|
|
|
4005
4017
|
}
|
|
4006
4018
|
}
|
|
4007
4019
|
const blockSetBehaviorActionImplementation = ({
|
|
4020
|
+
context,
|
|
4008
4021
|
action
|
|
4009
4022
|
}) => {
|
|
4010
4023
|
const location = toSlateRange({
|
|
@@ -4018,17 +4031,40 @@ const blockSetBehaviorActionImplementation = ({
|
|
|
4018
4031
|
}
|
|
4019
4032
|
}, action.editor);
|
|
4020
4033
|
if (!location)
|
|
4021
|
-
|
|
4034
|
+
throw new Error(`Unable to convert ${JSON.stringify(action.at)} into a Slate Range`);
|
|
4035
|
+
const block = Editor.node(action.editor, location, {
|
|
4036
|
+
depth: 1
|
|
4037
|
+
})?.[0];
|
|
4038
|
+
if (!block)
|
|
4039
|
+
throw new Error(`Unable to find block at ${JSON.stringify(action.at)}`);
|
|
4040
|
+
const parsedBlock = fromSlateValue([block], context.schema.block.name, KEY_TO_VALUE_ELEMENT.get(action.editor)).at(0);
|
|
4041
|
+
if (!parsedBlock)
|
|
4042
|
+
throw new Error(`Unable to parse block at ${JSON.stringify(action.at)}`);
|
|
4022
4043
|
const {
|
|
4023
|
-
|
|
4024
|
-
|
|
4025
|
-
|
|
4026
|
-
|
|
4027
|
-
|
|
4028
|
-
|
|
4044
|
+
_type,
|
|
4045
|
+
...filteredProps
|
|
4046
|
+
} = action.props, updatedBlock = parseBlock({
|
|
4047
|
+
context,
|
|
4048
|
+
block: {
|
|
4049
|
+
...parsedBlock,
|
|
4050
|
+
...filteredProps
|
|
4051
|
+
},
|
|
4052
|
+
options: {
|
|
4053
|
+
refreshKeys: !1
|
|
4054
|
+
}
|
|
4055
|
+
});
|
|
4056
|
+
if (!updatedBlock)
|
|
4057
|
+
throw new Error(`Unable to update block at ${JSON.stringify(action.at)}`);
|
|
4058
|
+
const slateBlock = toSlateValue([updatedBlock], {
|
|
4059
|
+
schemaTypes: context.schema
|
|
4060
|
+
})?.at(0);
|
|
4061
|
+
if (!slateBlock)
|
|
4062
|
+
throw new Error("Unable to convert block to Slate value");
|
|
4063
|
+
Transforms.setNodes(action.editor, slateBlock, {
|
|
4029
4064
|
at: location
|
|
4030
4065
|
});
|
|
4031
4066
|
}, blockUnsetBehaviorActionImplementation = ({
|
|
4067
|
+
context,
|
|
4032
4068
|
action
|
|
4033
4069
|
}) => {
|
|
4034
4070
|
const location = toSlateRange({
|
|
@@ -4041,7 +4077,53 @@ const blockSetBehaviorActionImplementation = ({
|
|
|
4041
4077
|
offset: 0
|
|
4042
4078
|
}
|
|
4043
4079
|
}, action.editor);
|
|
4044
|
-
|
|
4080
|
+
if (!location)
|
|
4081
|
+
throw new Error(`Unable to convert ${JSON.stringify(action.at)} into a Slate Range`);
|
|
4082
|
+
const block = Editor.node(action.editor, location, {
|
|
4083
|
+
depth: 1
|
|
4084
|
+
})?.[0];
|
|
4085
|
+
if (!block)
|
|
4086
|
+
throw new Error(`Unable to find block at ${JSON.stringify(action.at)}`);
|
|
4087
|
+
const parsedBlock = fromSlateValue([block], context.schema.block.name, KEY_TO_VALUE_ELEMENT.get(action.editor)).at(0);
|
|
4088
|
+
if (!parsedBlock)
|
|
4089
|
+
throw new Error(`Unable to parse block at ${JSON.stringify(action.at)}`);
|
|
4090
|
+
if (isTextBlock(context.schema, parsedBlock)) {
|
|
4091
|
+
const propsToRemove = action.props.filter((prop) => prop !== "_type"), updatedTextBlock = parseBlock({
|
|
4092
|
+
context,
|
|
4093
|
+
block: omit(parsedBlock, propsToRemove),
|
|
4094
|
+
options: {
|
|
4095
|
+
refreshKeys: !1
|
|
4096
|
+
}
|
|
4097
|
+
});
|
|
4098
|
+
if (!updatedTextBlock)
|
|
4099
|
+
throw new Error(`Unable to update block at ${JSON.stringify(action.at)}`);
|
|
4100
|
+
const propsToSet = {};
|
|
4101
|
+
for (const prop of propsToRemove)
|
|
4102
|
+
prop in updatedTextBlock ? propsToSet[prop] = updatedTextBlock[prop] : propsToSet[prop] = void 0;
|
|
4103
|
+
Transforms.setNodes(action.editor, propsToSet, {
|
|
4104
|
+
at: location
|
|
4105
|
+
});
|
|
4106
|
+
return;
|
|
4107
|
+
}
|
|
4108
|
+
const updatedBlockObject = parseBlock({
|
|
4109
|
+
context,
|
|
4110
|
+
block: omit(parsedBlock, action.props.filter((prop) => prop !== "_type")),
|
|
4111
|
+
options: {
|
|
4112
|
+
refreshKeys: !1
|
|
4113
|
+
}
|
|
4114
|
+
});
|
|
4115
|
+
if (!updatedBlockObject)
|
|
4116
|
+
throw new Error(`Unable to update block at ${JSON.stringify(action.at)}`);
|
|
4117
|
+
const {
|
|
4118
|
+
_type,
|
|
4119
|
+
_key,
|
|
4120
|
+
...props
|
|
4121
|
+
} = updatedBlockObject;
|
|
4122
|
+
Transforms.setNodes(action.editor, {
|
|
4123
|
+
_type,
|
|
4124
|
+
_key,
|
|
4125
|
+
value: props
|
|
4126
|
+
}, {
|
|
4045
4127
|
at: location
|
|
4046
4128
|
});
|
|
4047
4129
|
}, dataTransferSetActionImplementation = ({
|
|
@@ -4221,48 +4303,6 @@ const blockSetBehaviorActionImplementation = ({
|
|
|
4221
4303
|
editor: action.editor,
|
|
4222
4304
|
schema: context.schema
|
|
4223
4305
|
});
|
|
4224
|
-
}, textBlockSetActionImplementation = ({
|
|
4225
|
-
action
|
|
4226
|
-
}) => {
|
|
4227
|
-
const at = toSlateRange({
|
|
4228
|
-
anchor: {
|
|
4229
|
-
path: action.at,
|
|
4230
|
-
offset: 0
|
|
4231
|
-
},
|
|
4232
|
-
focus: {
|
|
4233
|
-
path: action.at,
|
|
4234
|
-
offset: 0
|
|
4235
|
-
}
|
|
4236
|
-
}, action.editor);
|
|
4237
|
-
Transforms.setNodes(action.editor, {
|
|
4238
|
-
...action.style ? {
|
|
4239
|
-
style: action.style
|
|
4240
|
-
} : {},
|
|
4241
|
-
...action.listItem ? {
|
|
4242
|
-
listItem: action.listItem
|
|
4243
|
-
} : {},
|
|
4244
|
-
...action.level ? {
|
|
4245
|
-
level: action.level
|
|
4246
|
-
} : {}
|
|
4247
|
-
}, {
|
|
4248
|
-
at
|
|
4249
|
-
});
|
|
4250
|
-
}, textBlockUnsetActionImplementation = ({
|
|
4251
|
-
action
|
|
4252
|
-
}) => {
|
|
4253
|
-
const at = toSlateRange({
|
|
4254
|
-
anchor: {
|
|
4255
|
-
path: action.at,
|
|
4256
|
-
offset: 0
|
|
4257
|
-
},
|
|
4258
|
-
focus: {
|
|
4259
|
-
path: action.at,
|
|
4260
|
-
offset: 0
|
|
4261
|
-
}
|
|
4262
|
-
}, action.editor);
|
|
4263
|
-
Transforms.unsetNodes(action.editor, action.props, {
|
|
4264
|
-
at
|
|
4265
|
-
});
|
|
4266
4306
|
}, behaviorActionImplementations = {
|
|
4267
4307
|
"annotation.add": addAnnotationActionImplementation,
|
|
4268
4308
|
"annotation.remove": removeAnnotationActionImplementation,
|
|
@@ -4468,9 +4508,7 @@ const blockSetBehaviorActionImplementation = ({
|
|
|
4468
4508
|
},
|
|
4469
4509
|
"style.toggle": toggleStyleActionImplementation,
|
|
4470
4510
|
"style.add": addStyleActionImplementation,
|
|
4471
|
-
"style.remove": removeStyleActionImplementation
|
|
4472
|
-
"text block.set": textBlockSetActionImplementation,
|
|
4473
|
-
"text block.unset": textBlockUnsetActionImplementation
|
|
4511
|
+
"style.remove": removeStyleActionImplementation
|
|
4474
4512
|
};
|
|
4475
4513
|
function performAction({
|
|
4476
4514
|
context,
|
|
@@ -4792,25 +4830,13 @@ function performDefaultAction({
|
|
|
4792
4830
|
});
|
|
4793
4831
|
break;
|
|
4794
4832
|
}
|
|
4795
|
-
|
|
4833
|
+
default: {
|
|
4796
4834
|
behaviorActionImplementations["style.toggle"]({
|
|
4797
4835
|
context,
|
|
4798
4836
|
action
|
|
4799
4837
|
});
|
|
4800
4838
|
break;
|
|
4801
4839
|
}
|
|
4802
|
-
case "text block.set": {
|
|
4803
|
-
behaviorActionImplementations["text block.set"]({
|
|
4804
|
-
context,
|
|
4805
|
-
action
|
|
4806
|
-
});
|
|
4807
|
-
break;
|
|
4808
|
-
}
|
|
4809
|
-
default:
|
|
4810
|
-
behaviorActionImplementations["text block.unset"]({
|
|
4811
|
-
context,
|
|
4812
|
-
action
|
|
4813
|
-
});
|
|
4814
4840
|
}
|
|
4815
4841
|
}
|
|
4816
4842
|
function createWithEventListeners(editorActor, subscriptions) {
|
|
@@ -5241,10 +5267,10 @@ function setPatch(editor, patch) {
|
|
|
5241
5267
|
} = findBlockAndChildFromPath(editor, patch.path);
|
|
5242
5268
|
if (!block)
|
|
5243
5269
|
return debug$7("Block not found"), !1;
|
|
5244
|
-
const
|
|
5245
|
-
if (
|
|
5270
|
+
const isTextBlock2 = editor.isTextBlock(block);
|
|
5271
|
+
if (isTextBlock2 && patch.path.length > 1 && patch.path[1] !== "children")
|
|
5246
5272
|
return debug$7("Ignoring setting void value"), !1;
|
|
5247
|
-
if (debugState(editor, "before"),
|
|
5273
|
+
if (debugState(editor, "before"), isTextBlock2 && child && childPath) {
|
|
5248
5274
|
if (Text.isText(value) && Text.isText(child)) {
|
|
5249
5275
|
const newText = child.text;
|
|
5250
5276
|
value.text !== newText && (debug$7("Setting text property"), editor.apply({
|