import { DOMParser as ProseMirrorDOMParser } from 'prosemirror-model'; export default ({ render }) => { /** * Converts a Markdown string into a ProseMirror JSONDocument based * on a ProseMirror schema. * * @param {Object} options — The schema and content for deserialization * @param {ProseMirror.Schema} params.schema A ProseMirror schema that defines * the types of content supported in the document * @param {String} params.content An arbitrary markdown string * * @returns An object with the following properties: * - document: A ProseMirror document object generated from the deserialized Markdown * - dom: The Markdown Deserializer renders Markdown as HTML to generate the ProseMirror * document. The dom property contains the HTML generated from the Markdown Source. */ return { deserialize: async ({ schema, content }) => { const html = await render(content); if (!html) return {}; const parser = new DOMParser(); const { body } = parser.parseFromString(html, 'text/html'); // append original source as a comment that nodes can access body.append(document.createComment(content)); return { document: ProseMirrorDOMParser.fromSchema(schema).parse(body), dom: body }; }, }; };