diff --git a/packages/core/index.ts b/packages/core/index.ts index 7c003189..a7a539ea 100644 --- a/packages/core/index.ts +++ b/packages/core/index.ts @@ -12,6 +12,7 @@ export { default as markPasteRule } from './src/pasteRules/markPasteRule' export { default as getSchema } from './src/utils/getSchema' export { default as generateHtml } from './src/utils/generateHtml' +export { default as getHtmlFromFragment } from './src/utils/getHtmlFromFragment' export { default as getTopNodeFromExtensions } from './src/utils/getTopNodeFromExtensions' export { default as getNodesFromExtensions } from './src/utils/getNodesFromExtensions' export { default as getMarksFromExtensions } from './src/utils/getMarksFromExtensions' diff --git a/packages/core/src/Editor.ts b/packages/core/src/Editor.ts index a9aed6f7..ce8d6758 100644 --- a/packages/core/src/Editor.ts +++ b/packages/core/src/Editor.ts @@ -10,6 +10,7 @@ import getNodeAttrs from './utils/getNodeAttrs' import getMarkAttrs from './utils/getMarkAttrs' import removeElement from './utils/removeElement' import getSchemaTypeByName from './utils/getSchemaTypeByName' +import getHtmlFromFragment from './utils/getHtmlFromFragment' import ExtensionManager from './ExtensionManager' import Extension from './Extension' import Node from './Node' @@ -357,14 +358,7 @@ export class Editor extends EventEmitter { * Get the document as HTML. */ public html() { - const div = document.createElement('div') - const fragment = DOMSerializer - .fromSchema(this.schema) - .serializeFragment(this.state.doc.content) - - div.appendChild(fragment) - - return div.innerHTML + return getHtmlFromFragment(this.state.doc, this.schema) } /** diff --git a/packages/core/src/utils/generateHtml.ts b/packages/core/src/utils/generateHtml.ts index e1f1b6f4..3706fed7 100644 --- a/packages/core/src/utils/generateHtml.ts +++ b/packages/core/src/utils/generateHtml.ts @@ -1,26 +1,11 @@ import getSchema from './getSchema' -import { Node as ProseMirrorNode, DOMSerializer } from 'prosemirror-model' +import getHtmlFromFragment from './getHtmlFromFragment' +import { Node, DOMSerializer } from 'prosemirror-model' import { Extensions } from '../types' -import { Schema } from 'prosemirror-model' -export default function generateHtml(doc: object, schema: (Extensions | Schema)): string { - let useSchema +export default function generateHtml(doc: object, extensions: Extensions): string { + const schema = getSchema(extensions) + const contentNode = Node.fromJSON(schema, doc) - if (Array.isArray(schema)) { - useSchema = getSchema(schema as Extensions) - } else { - useSchema = schema as Schema - } - - const contentNode = ProseMirrorNode.fromJSON(useSchema, doc) - const temporaryDocument = document.implementation.createHTMLDocument() - const container = temporaryDocument.createElement('div') - - const fragment = DOMSerializer - .fromSchema(useSchema) - .serializeFragment(contentNode.content) - - container.appendChild(fragment) - - return container.innerHTML + return getHtmlFromFragment(contentNode, schema) } diff --git a/packages/core/src/utils/getHtmlFromFragment.ts b/packages/core/src/utils/getHtmlFromFragment.ts new file mode 100644 index 00000000..f09a1174 --- /dev/null +++ b/packages/core/src/utils/getHtmlFromFragment.ts @@ -0,0 +1,14 @@ +import { Node as ProseMirrorNode, DOMSerializer } from 'prosemirror-model' +import { Schema } from 'prosemirror-model' + +export default function getHtmlFromFragment(doc: ProseMirrorNode, schema: Schema): string { + const fragment = DOMSerializer + .fromSchema(schema) + .serializeFragment(doc.content) + + const temporaryDocument = document.implementation.createHTMLDocument() + const container = temporaryDocument.createElement('div') + container.appendChild(fragment) + + return container.innerHTML +}