@atlaskit/editor-plugin-show-diff
Version:
ShowDiff plugin for @atlaskit/editor-core
60 lines (56 loc) • 2.21 kB
JavaScript
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.
*/
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 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.
*/
export var wrapInMarkViews = function wrapInMarkViews(targetNode, nodeDom, sources) {
if (targetNode.marks.length === 0 || !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;
};