UNPKG

@atlaskit/editor-plugin-show-diff

Version:

ShowDiff plugin for @atlaskit/editor-core

61 lines (57 loc) • 2.13 kB
import { DOMSerializer } from '@atlaskit/editor-prosemirror/model'; import { fg } from '@atlaskit/platform-feature-flags/fg'; /** * `@atlaskit/editor-prosemirror/view` doesn't re-export prosemirror-view's `MarkViewConstructor`, * so it's typed locally, as `EditorSSRRenderer` does. */ /** Where to look up a mark's renderer, and the view to render it against. */ /** * Renders a mark as ProseMirror does: `view.nodeViews` also holds mark views, keyed by mark name, * so `breakout` resolves whether it's registered under `markViews` or `nodeViews`. Falls back to * `toDOM` — they can differ: `breakout` renders `.fabric-editor-breakout-mark-dom`, which the width * CSS targets. */ const renderMarkView = (mark, inline, { nodeViews, view }) => { try { const markView = nodeViews === null || nodeViews === void 0 ? void 0 : nodeViews[mark.type.name]; if (markView && view) { const rendered = markView(mark, view, inline); return { dom: rendered.dom, contentDOM: rendered.contentDOM }; } const toDOM = mark.type.spec.toDOM; if (!toDOM) { return null; } return DOMSerializer.renderSpec(document, toDOM(mark, inline)); } catch { return null; } }; /** * Wraps rendered DOM in its marks, as ProseMirror does for the live document. Without this a * block node loses `breakout`, whose wrapper supplies the width. Marks nest * outside-in, so `marks[0]` is outermost. */ export const wrapInMarkViews = (targetNode, nodeDom, sources) => { if (targetNode.marks.length === 0 || !fg('platform_editor_ai_show_diff_patch_2')) { return nodeDom; } let wrapped = nodeDom; for (let index = targetNode.marks.length - 1; index >= 0; index--) { const mark = targetNode.marks[index]; const rendered = renderMarkView(mark, targetNode.isInline, sources); // No content hole means nowhere to nest the node, so skip the mark, not the node. if (!(rendered !== null && rendered !== void 0 && rendered.contentDOM)) { continue; } rendered.contentDOM.appendChild(wrapped); wrapped = rendered.dom; } return wrapped; };