UNPKG

@atlaskit/editor-plugin-card

Version:

Card plugin for @atlaskit/editor-core

129 lines (125 loc) 3.81 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.appearanceForLink = appearanceForLink; exports.getNodeContext = exports.findInNodeRange = exports.findAtPositions = exports.areSameNodes = void 0; exports.getNodeSubject = getNodeSubject; exports.getUrl = getUrl; exports.isDatasourceNode = isDatasourceNode; exports.isLinkNode = void 0; var _utils = require("../../pm-plugins/utils"); var _types = require("./types"); function isDatasourceNode(node) { return 'datasource' in node.attrs && !!node.attrs.datasource; } /** * Determine if a node is considered to be a link */ var isLinkNode = exports.isLinkNode = function isLinkNode(node) { if (isDatasourceNode(node)) { return false; } if (!!(0, _utils.appearanceForNodeType)(node.type)) { return true; } return hasLinkMark(node); }; function getNodeSubject(node) { if (isDatasourceNode(node)) { return _types.EVENT_SUBJECT.DATASOURCE; } if (isLinkNode(node)) { return _types.EVENT_SUBJECT.LINK; } return null; } /** * Analytics appearance for link object */ function appearanceForLink(node) { var appearance = (0, _utils.appearanceForNodeType)(node.type); if (appearance) { return appearance; } return 'url'; } var getLinkMark = function getLinkMark(node) { if (node.marks) { for (var i = 0; i < node.marks.length; i++) { var mark = node.marks[i]; if (mark.type.name === 'link') { return mark; } } } }; var hasLinkMark = function hasLinkMark(node) { return !!getLinkMark(node); }; function getUrl(node) { var _node$attrs$url, _node$attrs, _getLinkMark; return (_node$attrs$url = (_node$attrs = node.attrs) === null || _node$attrs === void 0 ? void 0 : _node$attrs.url) !== null && _node$attrs$url !== void 0 ? _node$attrs$url : (_getLinkMark = getLinkMark(node)) === null || _getLinkMark === void 0 || (_getLinkMark = _getLinkMark.attrs) === null || _getLinkMark === void 0 ? void 0 : _getLinkMark.href; } var getNodeContext = exports.getNodeContext = function getNodeContext(doc, pos) { var $pos = doc.resolve(pos); var maxDepth = 3; for (var i = 0; i <= maxDepth; i++) { var node = $pos.node($pos.depth - i); if (node && node.type.name !== 'paragraph') { return node.type.name; } } return 'unknown'; }; var findAtPositions = exports.findAtPositions = function findAtPositions(tr, positions) { var entities = []; for (var i = 0; i < positions.length; i++) { var pos = positions[i]; var node = tr.doc.nodeAt(pos); if (!node) { continue; } var nodeContext = getNodeContext(tr.doc, pos); entities.push({ pos: pos, node: node, nodeContext: nodeContext }); } return entities; }; var findInNodeRange = exports.findInNodeRange = function findInNodeRange(doc, from, to, predicate) { var entities = []; doc.nodesBetween(from, to, function (node, pos) { if (predicate(node)) { var entirelyInRange = pos >= from && pos + node.nodeSize <= to; if (entirelyInRange) { var nodeContext = getNodeContext(doc, pos); entities.push({ pos: pos, node: node, nodeContext: nodeContext }); } } }); return entities; }; /** * Returns whether or not two sets of links appear to likely be the same set of links * That they are in the same order and that both their hrefs and appearances match */ var areSameNodes = exports.areSameNodes = function areSameNodes(setA, setB) { if (setA.length !== setB.length) { return false; } for (var i = 0; i < setA.length; i++) { var a = setA[i]; var b = setB[i]; if (getUrl(a.node) !== getUrl(b.node) || appearanceForLink(a.node) !== appearanceForLink(b.node)) { return false; } } return true; };