UNPKG

@atlaskit/editor-plugin-show-diff

Version:

ShowDiff plugin for @atlaskit/editor-core

65 lines (61 loc) • 2.35 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.wrapInMarkViews = void 0; var _model = require("@atlaskit/editor-prosemirror/model"); var _fg = require("@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. */ var renderMarkView = function renderMarkView(mark, inline, _ref) { var nodeViews = _ref.nodeViews, view = _ref.view; try { var markView = nodeViews === null || nodeViews === void 0 ? void 0 : nodeViews[mark.type.name]; if (markView && view) { var rendered = markView(mark, view, inline); return { dom: rendered.dom, contentDOM: rendered.contentDOM }; } var toDOM = mark.type.spec.toDOM; if (!toDOM) { return null; } return _model.DOMSerializer.renderSpec(document, toDOM(mark, inline)); } catch (_unused) { 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. */ var wrapInMarkViews = exports.wrapInMarkViews = function wrapInMarkViews(targetNode, nodeDom, sources) { if (targetNode.marks.length === 0 || !(0, _fg.fg)('platform_editor_ai_show_diff_patch_2')) { return nodeDom; } var wrapped = nodeDom; for (var index = targetNode.marks.length - 1; index >= 0; index--) { var _mark = targetNode.marks[index]; var 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; };