@zodiac-ui/editor
Version:
A rich text editor for Angular based on `@atlaskit/editor-core`.
77 lines • 11.3 kB
JavaScript
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=