UNPKG

@zodiac-ui/editor

Version:

A rich text editor for Angular based on `@atlaskit/editor-core`.

77 lines 11.3 kB
import { DecorationSet, Decoration } from 'prosemirror-view'; import { PluginKey, Plugin } from 'prosemirror-state'; export const ZWSP = '\u200b'; export const inlineCursorTargetStateKey = new PluginKey('inlineCursorTargetPlugin'); export const SPECIAL_NODES = ['mention', 'emoji']; export const isSpecial = (node) => { return node && SPECIAL_NODES.indexOf(node.type.name) !== -1; }; export const findSpecialNodeAfter = ($pos, tr) => { if (isSpecial($pos.nodeAfter)) { return $pos.pos + 1; } const { parentOffset, parent } = $pos; const docSize = tr.doc.nodeSize - 2; if (parentOffset === parent.content.size && $pos.pos + 1 < docSize - 2) { const { nodeAfter } = tr.doc.resolve($pos.pos + 1); if (nodeAfter && isSpecial(nodeAfter.firstChild)) { return $pos.pos + 2; } } }; export const findSpecialNodeBefore = ($pos, tr) => { if (isSpecial($pos.nodeBefore)) { return $pos.pos - 1; } if ($pos.pos === 0) { return; } const { parentOffset } = $pos; if (parentOffset === 0) { const { nodeBefore } = tr.doc.resolve($pos.pos - 1); if (nodeBefore && isSpecial(nodeBefore.firstChild)) { return $pos.pos - 2; } } }; export const inlineCursorTargetPlugin = () => { return new Plugin({ key: inlineCursorTargetStateKey, state: { init: () => ({ positions: [] }), apply(tr) { const { selection } = tr; const { $from } = selection; const positions = []; const posAfter = findSpecialNodeAfter($from, tr); const posBefore = findSpecialNodeBefore($from, tr); if (posAfter !== undefined) { positions.push(posAfter); } if (posBefore !== undefined) { positions.push(posBefore); } return { positions }; }, }, props: { decorations(state) { const { doc } = state; const { positions } = inlineCursorTargetStateKey.getState(state); if (positions && positions.length) { const decorations = positions.map(position => { const node = document.createElement('span'); node.appendChild(document.createTextNode(ZWSP)); return Decoration.widget(position, node, { raw: true, side: -1, }); }); return DecorationSet.create(doc, decorations); } return null; }, }, }); }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5saW5lLWN1cnNvci10YXJnZXQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aem9kaWFjLXVpL2VkaXRvci8iLCJzb3VyY2VzIjpbInBsdWdpbnMvYmFzZS9wbS9pbmxpbmUtY3Vyc29yLXRhcmdldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUE0QixNQUFNLG1CQUFtQixDQUFDO0FBRWhGLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUM7QUFFN0IsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxTQUFTLENBQ25ELDBCQUEwQixDQUM3QixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBRWxELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxDQUFDLElBQTZCLEVBQUUsRUFBRTtJQUN2RCxPQUFPLElBQUksSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDaEUsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxJQUFpQixFQUFFLEVBQWUsRUFBRSxFQUFFO0lBQ3ZFLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtRQUMzQixPQUFPLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0tBQ3ZCO0lBRUQsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBRXBDLElBQUksWUFBWSxLQUFLLE1BQU0sQ0FBQyxPQUFPLENB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QUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUU7NEJBQ3JDLEdBQUcsRUFBRSxJQUFJOzRCQUNULElBQUksRUFBRSxDQUFDLENBQUM7eUJBQ0osQ0FBQyxDQUFDO29CQUNkLENBQUMsQ0FBQyxDQUFDO29CQUVILE9BQU8sYUFBYSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUM7aUJBQ2pEO2dCQUVELE9BQU8sSUFBSSxDQUFDO1lBQ2hCLENBQUM7U0FDSjtLQUNKLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlY29yYXRpb25TZXQsIERlY29yYXRpb24gfSBmcm9tICdwcm9zZW1pcnJvci12aWV3JztcclxuaW1wb3J0IHsgUmVzb2x2ZWRQb3MsIE5vZGUgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XHJcbmltcG9ydCB7IFBsdWdpbktleSwgUGx1Z2luLCBFZGl0b3JTdGF0ZSwgVHJhbnNhY3Rpb24gfSBmcm9tICdwcm9zZW1pcnJvci1zdGF0ZSc7XHJcblxyXG5leHBvcnQgY29uc3QgWldTUCA9ICdcXHUyMDBiJztcclxuXHJcbmV4cG9ydCBjb25zdCBpbmxpbmVDdXJzb3JUYXJnZXRTdGF0ZUtleSA9IG5ldyBQbHVnaW5LZXkoXHJcbiAgICAnaW5saW5lQ3Vyc29yVGFyZ2V0UGx1Z2luJyxcclxuKTtcclxuXHJcbmV4cG9ydCBjb25zdCBTUEVDSUFMX05PREVTID0gWydtZW50aW9uJywgJ2Vtb2ppJ107XHJcblxyXG5leHBvcnQgY29uc3QgaXNTcGVjaWFsID0gKG5vZGU6IE5vZGUgfCBudWxsIHwgdW5kZWZpbmVkKSA9PiB7XHJcbiAgICByZXR1cm4gbm9kZSAmJiBTUEVDSUFMX05PREVTLmluZGV4T2Yobm9kZS50eXBlLm5hbWUpICE9PSAtMTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBmaW5kU3BlY2lhbE5vZGVBZnRlciA9ICgkcG9zOiBSZXNvbHZlZFBvcywgdHI6IFRyYW5zYWN0aW9uKSA9PiB7XHJcbiAgICBpZiAoaXNTcGVjaWFsKCRwb3Mubm9kZUFmdGVyKSkge1xyXG4gICAgICAgIHJldHVybiAkcG9zLnBvcyArIDE7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgeyBwYXJlbnRPZmZzZXQsIHBhcmVudCB9ID0gJHBvcztcclxuICAgIGNvbnN0IGRvY1NpemUgPSB0ci5kb2Mubm9kZVNpemUgLSAyO1xyXG5cclxuICAgIGlmIChwYXJlbnRPZmZzZXQgPT09IHBhcmVudC5jb250ZW50LnNpemUgJiYgJHBvcy5wb3MgKyAxIDwgZG9jU2l6ZSAtIDIpIHtcclxuICAgICAgICBjb25zdCB7IG5vZGVBZnRlciB9ID0gdHIuZG9jLnJlc29sdmUoJHBvcy5wb3MgKyAxKTtcclxuICAgICAgICBpZiAobm9kZUFmdGVyICYmIGlzU3BlY2lhbChub2RlQWZ0ZXIuZmlyc3RDaGlsZCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuICRwb3MucG9zICsgMjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZmluZFNwZWNpYWxOb2RlQmVmb3JlID0gKCRwb3M6IFJlc29sdmVkUG9zLCB0cjogVHJhbnNhY3Rpb24pID0+IHtcclxuICAgIGlmIChpc1NwZWNpYWwoJHBvcy5ub2RlQmVmb3JlKSkge1xyXG4gICAgICAgIHJldHVybiAkcG9zLnBvcyAtIDE7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCRwb3MucG9zID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHsgcGFyZW50T2Zmc2V0IH0gPSAkcG9zO1xyXG5cclxuICAgIGlmIChwYXJlbnRPZmZzZXQgPT09IDApIHtcclxuICAgICAgICBjb25zdCB7IG5vZGVCZWZvcmUgfSA9IHRyLmRvYy5yZXNvbHZlKCRwb3MucG9zIC0gMSk7XHJcbiAgICAgICAgaWYgKG5vZGVCZWZvcmUgJiYgaXNTcGVjaWFsKG5vZGVCZWZvcmUuZmlyc3RDaGlsZCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuICRwb3MucG9zIC0gMjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaW5saW5lQ3Vyc29yVGFyZ2V0UGx1Z2luID0gKCkgPT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQbHVnaW4oe1xyXG4gICAgICAgIGtleTogaW5saW5lQ3Vyc29yVGFyZ2V0U3RhdGVLZXksXHJcblxyXG4gICAgICAgIHN0YXRlOiB7XHJcbiAgICAgICAgICAgIGluaXQ6ICgpID0+ICh7IHBvc2l0aW9uczogW10gfSksXHJcbiAgICAgICAgICAgIGFwcGx5KHRyKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHNlbGVjdGlvbiB9ID0gdHI7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7ICRmcm9tIH0gPSBzZWxlY3Rpb247XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSBbXSBhcyBudW1iZXJbXTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBwb3NBZnRlciA9IGZpbmRTcGVjaWFsTm9kZUFmdGVyKCRmcm9tLCB0cik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwb3NCZWZvcmUgPSBmaW5kU3BlY2lhbE5vZGVCZWZvcmUoJGZyb20sIHRyKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocG9zQWZ0ZXIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9ucy5wdXNoKHBvc0FmdGVyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocG9zQmVmb3JlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbnMucHVzaChwb3NCZWZvcmUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB7IHBvc2l0aW9ucyB9O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHByb3BzOiB7XHJcbiAgICAgICAgICAgIGRlY29yYXRpb25zKHN0YXRlOiBFZGl0b3JTdGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyBkb2MgfSA9IHN0YXRlO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyBwb3NpdGlvbnMgfSA9IGlubGluZUN1cnNvclRhcmdldFN0YXRlS2V5LmdldFN0YXRlKHN0YXRlKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb25zICYmIHBvc2l0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWNvcmF0aW9ucyA9IHBvc2l0aW9ucy5tYXAocG9zaXRpb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFpXU1ApKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERlY29yYXRpb24ud2lkZ2V0KHBvc2l0aW9uLCBub2RlLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXc6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWRlOiAtMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBhbnkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGVjb3JhdGlvblNldC5jcmVhdGUoZG9jLCBkZWNvcmF0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgIH0pO1xyXG59O1xyXG4iXX0=