@atlaskit/editor-plugin-code-block-advanced
Version:
CodeBlockAdvanced plugin for @atlaskit/editor-core
142 lines (140 loc) • 6.6 kB
JavaScript
;
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;
}
});
};