Возможно ли иметь полную пользовательскую функцию renderHTML в TipTap?

На данный момент формат такой:

renderHTML({ HTMLAttributes }) {
    return ['img', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)];
  },

Теперь я мог бы сделать что-то вроде этого:

renderHTML({ HTMLAttributes }) {
    return <div>hello</div>;
  },

Обновлено с помощью addNodeView:

Итак, теперь у меня есть CustomImage.js:

const CustomImage = Image.extend({
  addNodeView() {
    return ReactNodeViewRenderer(NextImage);
  },
});
export default CustomImage;

И NextImage:

const NextImage = () => {
  return (
    <NodeViewWrapper>
      <div>hello</div>
    </NodeViewWrapper>
  );
};

export default NextImage;

И я использую это так:

html = generateHTML(JSON.parse(text), [
        CustomImage
   ....

2
195
1

Ответ:

Решено

Функция renderHtml вызывается при запуске editor.getHTML()

Чтобы ответить на ваш вопрос, насколько мне известно, он должен соответствовать их формату. Чтобы достичь того, чего вы хотите, вы можете сделать что-то вроде этого:

renderHTML({ HTMLAttributes }) {
    // On output
    return [
      "div",
      mergeAttributes(HTMLAttributes), // mergeAttributes is a exported function from @tiptap/core
      "hello",
    ];
  },

Если вы, с другой стороны, хотите отобразить это в редакторе, вы должны использовать:

addNodeView() {
    return ReactNodeViewRenderer(YourComponentHere);
  },

И вы можете показать любой компонент, который хотите:

import { NodeViewWrapper } from "@tiptap/react";
import React from "react";

const YourComponentHere = ({ node, updateAttributes, selected, editor }) => {
  return (
    <NodeViewWrapper>
      <div>hello</div>
    </NodeViewWrapper>
  );
};

Редактировать: Предполагая, что вы используете реакцию, вы должны использовать useEditor, если хотите использовать редактор подсказок.

import { useEditor, EditorContent } from '@tiptap/react'
import StarterKit from '@tiptap/starter-kit'
import CustomImage from './CustomImage'

const Tiptap = () => {
  const editor = useEditor({
    extensions: [
      StarterKit,
      CustomImage
    ],
    content: '<p>Your inital content here</p>',
  })

  return (
    <EditorContent editor = {editor} />
  )
}

export default Tiptap

https://tiptap.dev/installation/react