diff --git a/packages/core/src/commands/insertContentAt.ts b/packages/core/src/commands/insertContentAt.ts index 659761e6..4f655c52 100644 --- a/packages/core/src/commands/insertContentAt.ts +++ b/packages/core/src/commands/insertContentAt.ts @@ -1,7 +1,10 @@ import createNodeFromContent from '../helpers/createNodeFromContent' import selectionToInsertionEnd from '../helpers/selectionToInsertionEnd' import { - Command, RawCommands, Content, Range, + Command, + RawCommands, + Content, + Range, } from '../types' declare module '@tiptap/core' { @@ -17,19 +20,12 @@ declare module '@tiptap/core' { export const insertContentAt: RawCommands['insertContentAt'] = (range, value) => ({ tr, dispatch, editor }) => { if (dispatch) { - const content = createNodeFromContent(value, editor.schema) - - if (typeof content === 'string') { - tr.insertText(content) - tr.scrollIntoView() - - return true - } - if (range.from !== range.to) { - tr.delete(range.from, range.to) + tr.deleteRange(range.from, range.to) } + const content = createNodeFromContent(value, editor.schema) + tr.insert(range.from, content) selectionToInsertionEnd(tr, tr.steps.length - 1, -1) tr.scrollIntoView() diff --git a/packages/core/src/helpers/createNodeFromContent.ts b/packages/core/src/helpers/createNodeFromContent.ts index 25be7ae6..a1f1d1e9 100644 --- a/packages/core/src/helpers/createNodeFromContent.ts +++ b/packages/core/src/helpers/createNodeFromContent.ts @@ -17,15 +17,19 @@ export default function createNodeFromContent( content: Content, schema: Schema, options?: CreateNodeFromContentOptions, -): string | ProseMirrorNode | Fragment { +): ProseMirrorNode | Fragment { options = { slice: true, parseOptions: {}, ...options, } - if (content && typeof content === 'object') { + if (typeof content === 'object' && content !== null) { try { + if (Array.isArray(content)) { + return Fragment.fromArray(content.map(item => schema.nodeFromJSON(item))) + } + return schema.nodeFromJSON(content) } catch (error) { console.warn( @@ -41,17 +45,11 @@ export default function createNodeFromContent( } if (typeof content === 'string') { - const isHTML = content.trim().startsWith('<') && content.trim().endsWith('>') + const parser = DOMParser.fromSchema(schema) - if (isHTML || !options.slice) { - const parser = DOMParser.fromSchema(schema) - - return options.slice - ? parser.parseSlice(elementFromString(content), options.parseOptions).content - : parser.parse(elementFromString(content), options.parseOptions) - } - - return content + return options.slice + ? parser.parseSlice(elementFromString(content), options.parseOptions).content + : parser.parse(elementFromString(content), options.parseOptions) } return createNodeFromContent('', schema, options) diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 5aa19959..e00b09b7 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -66,6 +66,7 @@ export type JSONContent = { type: string, attrs?: Record, content?: JSONContent[], + text?: string, [key: string]: any, }