prosemirror: преобразование вывода JSON в HTML

Я пытаюсь преобразовать вывод JSON ProseMirror обратно в HTML (чтобы сохранить его из одной БД в другую). Я новичок в ProseMirror и не уверен, что полностью понимаю связь между моделью, состоянием и схемой.

Судя по тому, что я прочитал, https://github.com/ProseMirror/prosemirror/issues/455 и https://discuss.prosemirror.net/t/example-of-converting-between-formats-for-the-purpose-of-saving/424,

Сначала я должен создать новое состояние на основе базовой схемы, затем использовать DOMSerializer и прикрепить вывод к временному элементу (затем получить innerHtml). Звучит ли это правильно? Любая помощь будет принята с благодарностью.

2 ответа

После некоторых копаний вот как я получил это на работу:

  1. Создайте узел, используя.fromJSON
  2. Создайте DOMSerializer на основе схемы, используемой редактором
  3. Передайте узел в сериализатор

Мой код ниже.

const { schema } = require("prosemirror-schema-basic")
const { Node, DOMSerializer } = require("prosemirror-model")
const jsdom = require("jsdom").JSDOM

let dom = new jsdom('<!DOCTYPE html><div id="content"></div>')
let doc = dom.window.document
let target = doc.querySelector("div")
//Demo JSON output from ProseMirror
let content = {
  "doc": {
    "type": "doc",
    "content": [{
      "type": "paragraph",
      "attrs": {
        "align": "left"
      },
      "content": [{
        "type": "text",
        "text": "My sample text"
      }]
    }]
  },
  "selection": {
    "type": "text",
    "anchor": 16,
    "head": 16
  }
}

let contentNode = Node.fromJSON(schema, content.doc)

DOMSerializer
  .fromSchema(schema)
  .serializeFragment(contentNode.content, {
    "document": doc
  }, target)

console.log(doc.getElementById("content").innerHTML)
//<p>My sample text</p>

Примечание для будущих читателей. Если вы используете React и хотите получать уценку при обновлении содержимого редактора, вот пример.

      import { OnChangeJSON, Remirror } from '@remirror/react';
import { MarkdownExtension } from 'remirror/extensions';
import { useRemirror } from '@remirror/react';
import { RemirrorJSON } from '@remirror/core';


export interface MarkdownControlledEditorProps {
export interface MarkdownControlledEditorProps {
  onChangeJson: (json: RemirrorJSON) => void,
  onChangeMarkdown: (markdown: string) => void,
  initialContent?: string,
}
export const MarkdownControlledEditor = ({
  onChangeJson,
  onChangeMarkdown,
  initialContent,
}: any) => {
  const { manager } = useRemirror({
    selection: 'start',
    extensions: RemirrorExtensionsPreset,
  });

  const _onChangeJson = (json: RemirrorJSON) => {
    onChangeContent({
      json,
      html: manager.store.helpers.getHTML(),
      text: manager.store.helpers.getText(),
      markdown: manager.store.helpers.getMarkdown(),
    });
  }

  return (
    <Remirror
      autoFocus={true}
      autoRender={'start'}
      manager={manager}
      initialContent={initialContent}
    >
      <OnChangeJSON onChange={_onChangeJson}/>
    </Remirror>
  );
};
Другие вопросы по тегам