UNPKG

@atlaskit/editor-plugin-code-block-advanced

Version:

CodeBlockAdvanced plugin for @atlaskit/editor-core

142 lines (140 loc) 6.6 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.sortDecorationsByPositionAndSide = exports.prosemirrorDecorationPlugin = void 0; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _view = require("@codemirror/view"); var _platformFeatureFlags = require("@atlaskit/platform-feature-flags"); function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } var PMWidget = /*#__PURE__*/function (_WidgetType) { function PMWidget(toDOMElement) { var _this; (0, _classCallCheck2.default)(this, PMWidget); _this = _callSuper(this, PMWidget); _this.toDOMElement = toDOMElement; return _this; } (0, _inherits2.default)(PMWidget, _WidgetType); return (0, _createClass2.default)(PMWidget, [{ key: "toDOM", value: function toDOM() { return this.toDOMElement; } }, { key: "ignoreEvent", value: function ignoreEvent() { return false; } }]); }(_view.WidgetType); // This type is not exposed publically by ProseMirror but we need it to map to CodeMirror // See: https://github.com/ProseMirror/prosemirror-view/blob/master/src/decoration.ts // This type is not exposed publically by ProseMirror but we need it to map to CodeMirror // See: https://github.com/ProseMirror/prosemirror-view/blob/master/src/decoration.ts // This type is not exposed publically by ProseMirror but we need it to map to CodeMirror // See: https://github.com/ProseMirror/prosemirror-view/blob/master/src/decoration.ts function isExtendedDecoration(decoration) { return decoration.inline !== undefined && decoration.widget !== undefined && decoration.type !== undefined; } var getHTMLElement = function getHTMLElement(toDOM, view, getPos) { if (toDOM instanceof Function) { var element = toDOM(view, getPos); return element instanceof HTMLElement ? element : undefined; } else if (toDOM instanceof HTMLElement) { return toDOM; } }; var mapPMDecorationToCMDecoration = function mapPMDecorationToCMDecoration(decoration, view, getPos) { if (!isExtendedDecoration(decoration)) { return undefined; } if (decoration.inline) { var markDecoration = _view.Decoration.mark({ attributes: decoration.type.attrs }); return markDecoration.range(decoration.from, decoration.to); } else if (decoration.widget) { var _decoration$type; var toDOM = getHTMLElement(decoration === null || decoration === void 0 || (_decoration$type = decoration.type) === null || _decoration$type === void 0 ? void 0 : _decoration$type.toDOM, view, getPos); if (!toDOM) { return undefined; } var widgetDecoration = _view.Decoration.widget({ widget: new PMWidget(toDOM), side: decoration.type.side }); return widgetDecoration.range(decoration.from, decoration.to); } }; function isDefined(value) { return value !== undefined; } var sortDecorationsByPositionAndSide = exports.sortDecorationsByPositionAndSide = function sortDecorationsByPositionAndSide(a, b) { return a.from - b.from || a.value.startSide - b.value.startSide; }; /** * Creates CodeMirror versions of the decorations provided by ProseMirror. * * Inline ProseMirror decorations -> Mark CodeMirror decorations * Widget ProseMirror decorations -> Widget CodeMirror decorations * * This way any decorations applied in ProseMirror land should automatically be supported * by the CodeMirror editor * * @param updateDecorationsEffect Facet for the prosemirror decorations * @returns CodeMirror extension */ var prosemirrorDecorationPlugin = exports.prosemirrorDecorationPlugin = function prosemirrorDecorationPlugin(updateDecorationsEffect, editorView, getPos) { return _view.ViewPlugin.fromClass( /*#__PURE__*/function () { function _class(view) { (0, _classCallCheck2.default)(this, _class); this.decorations = this.updateDecorations(view); } return (0, _createClass2.default)(_class, [{ key: "updateDecorations", value: function updateDecorations(view) { var _view$viewport = view.viewport, from = _view$viewport.from, to = _view$viewport.to; var innnerDecorations = view.state.facet(updateDecorationsEffect); var allDecorations = []; innnerDecorations === null || innnerDecorations === void 0 || innnerDecorations.map(function (source) { source === null || source === void 0 || source.forEachSet(function (set) { var decorations = set.find(from, to) // Do not render the code block line decorations .filter(function (dec) { return dec.spec.type !== 'decorationWidgetType'; }); allDecorations.push.apply(allDecorations, (0, _toConsumableArray2.default)(decorations)); }); }); var cmDecorations = allDecorations.sort(function (a, b) { return a.from < b.from ? -1 : 1; }).map(function (decoration) { return mapPMDecorationToCMDecoration(decoration, editorView, getPos); }).filter(isDefined); if ((0, _platformFeatureFlags.fg)('platform_editor_fix_decoration_edge_case')) { return _view.Decoration.set(cmDecorations.sort(sortDecorationsByPositionAndSide)); } else { return _view.Decoration.set(cmDecorations); } } }, { key: "update", value: function update(_update) { this.decorations = this.updateDecorations(_update.view); } }]); }(), { decorations: function decorations(v) { return v.decorations; } }); };