@zodiac-ui/editor
Version:
A rich text editor for Angular based on `@atlaskit/editor-core`.
49 lines • 8.12 kB
JavaScript
import { hasParentNodeOfType } from 'prosemirror-utils';
import { TextSelection, NodeSelection, } from 'prosemirror-state';
export const insertBlock = (state, nodeType, nodeName, start, end, attrs) => {
// To ensure that match is done after HardBreak.
const { hardBreak, codeBlock, listItem } = state.schema.nodes;
const $pos = state.doc.resolve(start);
if ($pos.nodeAfter.type !== hardBreak) {
return null;
}
// To ensure no nesting is done. (unless we're inserting a codeBlock inside lists)
if ($pos.depth > 1 &&
!(nodeType === codeBlock && hasParentNodeOfType(listItem)(state.selection))) {
return null;
}
// Split at the start of autoformatting and delete formatting characters.
let tr = state.tr.delete(start, end).split(start);
let currentNode = tr.doc.nodeAt(start + 1);
// If node has more content split at the end of autoformatting.
let nodeHasMoreContent = false;
tr.doc.nodesBetween(start, start + currentNode.nodeSize, (node, pos) => {
if (!nodeHasMoreContent && node.type === hardBreak) {
nodeHasMoreContent = true;
tr = tr.split(pos + 1).delete(pos, pos + 1);
}
});
if (nodeHasMoreContent) {
currentNode = tr.doc.nodeAt(start + 1);
}
// Create new node and fill with content of current node.
const { blockquote, paragraph } = state.schema.nodes;
let content;
let depth;
if (nodeType === blockquote) {
depth = 3;
content = [paragraph.create({}, currentNode.content)];
}
else {
depth = 2;
content = currentNode.content;
}
const newNode = nodeType.create(attrs, content);
// Add new node.
tr = tr
.setSelection(new NodeSelection(tr.doc.resolve(start + 1)))
.replaceSelectionWith(newNode)
.setSelection(new TextSelection(tr.doc.resolve(start + depth)));
return tr;
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zZXJ0LWJsb2NrLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHpvZGlhYy11aS9lZGl0b3IvIiwic291cmNlcyI6WyJwbHVnaW5zL2Jsb2NrLXR5cGUvaW5zZXJ0LWJsb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3hELE9BQU8sRUFDSCxhQUFhLEVBQ2IsYUFBYSxHQUdoQixNQUFNLG1CQUFtQixDQUFDO0FBRTNCLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxDQUN2QixLQUFrQixFQUNsQixRQUFrQixFQUNsQixRQUFnQixFQUNoQixLQUFLLEVBQ0wsR0FBRyxFQUNILEtBQThCLEVBQ1osRUFBRTtJQUNwQixnREFBZ0Q7SUFDaEQsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDOUQsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7UUFDbkMsT0FBTyxJQUFJLENBQUM7S0FDZjtJQUVELGtGQUFrRjtJQUNsRixJQUNJLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQztRQUNkLENBQUMsQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUM3RTtRQUNFLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7SUFFRCx5RUFBeUU7SUFDekUsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsRCxJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFFM0MsK0RBQStEO0lBQy9ELElBQUksa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0lBQy9CLEVBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUNmLEtBQUssRUFDTCxLQUFLLEdBQUksV0FBc0IsQ0FBQyxRQUFRLEVBQ3hDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ1YsSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQ2hELGtCQUFrQixHQUFHLElBQUksQ0FBQztZQUMxQixFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDL0M7SUFDTCxDQUFDLENBQ0osQ0FBQztJQUNGLElBQUksa0JBQWtCLEVBQUU7UUFDcEIsV0FBVyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztLQUMxQztJQUVELHlEQUF5RDtJQUN6RCxNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQ3JELElBQUksT0FBTyxDQUFDO0lBQ1osSUFBSSxLQUFLLENBQUM7SUFDVixJQUFJLFFBQVEsS0FBSyxVQUFVLEVBQUU7UUFDekIsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNWLE9BQU8sR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFHLFdBQXNCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztLQUNyRTtTQUFNO1FBQ0gsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNWLE9BQU8sR0FBSSxXQUFzQixDQUFDLE9BQU8sQ0FBQztLQUM3QztJQUNELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRWhELGdCQUFnQjtJQUNoQixFQUFFLEdBQUcsRUFBRTtTQUNGLFlBQVksQ0FBQyxJQUFJLGFBQWEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMxRCxvQkFBb0IsQ0FBQyxPQUFPLENBQUM7U0FDN0IsWUFBWSxDQUFDLElBQUksYUFBYSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEUsT0FBTyxFQUFFLENBQUM7QUFDZCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOb2RlVHlwZSwgTm9kZSBhcyBQTU5vZGUgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XHJcbmltcG9ydCB7IGhhc1BhcmVudE5vZGVPZlR5cGUgfSBmcm9tICdwcm9zZW1pcnJvci11dGlscyc7XHJcbmltcG9ydCB7XHJcbiAgICBUZXh0U2VsZWN0aW9uLFxyXG4gICAgTm9kZVNlbGVjdGlvbixcclxuICAgIEVkaXRvclN0YXRlLFxyXG4gICAgVHJhbnNhY3Rpb24sXHJcbn0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xyXG5cclxuZXhwb3J0IGNvbnN0IGluc2VydEJsb2NrID0gKFxyXG4gICAgc3RhdGU6IEVkaXRvclN0YXRlLFxyXG4gICAgbm9kZVR5cGU6IE5vZGVUeXBlLFxyXG4gICAgbm9kZU5hbWU6IHN0cmluZyxcclxuICAgIHN0YXJ0LFxyXG4gICAgZW5kLFxyXG4gICAgYXR0cnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9LFxyXG4pOiBUcmFuc2FjdGlvbiB8IG51bGwgPT4ge1xyXG4gICAgLy8gVG8gZW5zdXJlIHRoYXQgbWF0Y2ggaXMgZG9uZSBhZnRlciBIYXJkQnJlYWsuXHJcbiAgICBjb25zdCB7IGhhcmRCcmVhaywgY29kZUJsb2NrLCBsaXN0SXRlbSB9ID0gc3RhdGUuc2NoZW1hLm5vZGVzO1xyXG4gICAgY29uc3QgJHBvcyA9IHN0YXRlLmRvYy5yZXNvbHZlKHN0YXJ0KTtcclxuICAgIGlmICgkcG9zLm5vZGVBZnRlci50eXBlICE9PSBoYXJkQnJlYWspIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBUbyBlbnN1cmUgbm8gbmVzdGluZyBpcyBkb25lLiAodW5sZXNzIHdlJ3JlIGluc2VydGluZyBhIGNvZGVCbG9jayBpbnNpZGUgbGlzdHMpXHJcbiAgICBpZiAoXHJcbiAgICAgICAgJHBvcy5kZXB0aCA+IDEgJiZcclxuICAgICAgICAhKG5vZGVUeXBlID09PSBjb2RlQmxvY2sgJiYgaGFzUGFyZW50Tm9kZU9mVHlwZShsaXN0SXRlbSkoc3RhdGUuc2VsZWN0aW9uKSlcclxuICAgICkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFNwbGl0IGF0IHRoZSBzdGFydCBvZiBhdXRvZm9ybWF0dGluZyBhbmQgZGVsZXRlIGZvcm1hdHRpbmcgY2hhcmFjdGVycy5cclxuICAgIGxldCB0ciA9IHN0YXRlLnRyLmRlbGV0ZShzdGFydCwgZW5kKS5zcGxpdChzdGFydCk7XHJcbiAgICBsZXQgY3VycmVudE5vZGUgPSB0ci5kb2Mubm9kZUF0KHN0YXJ0ICsgMSk7XHJcblxyXG4gICAgLy8gSWYgbm9kZSBoYXMgbW9yZSBjb250ZW50IHNwbGl0IGF0IHRoZSBlbmQgb2YgYXV0b2Zvcm1hdHRpbmcuXHJcbiAgICBsZXQgbm9kZUhhc01vcmVDb250ZW50ID0gZmFsc2U7XHJcbiAgICB0ci5kb2Mubm9kZXNCZXR3ZWVuKFxyXG4gICAgICAgIHN0YXJ0LFxyXG4gICAgICAgIHN0YXJ0ICsgKGN1cnJlbnROb2RlIGFzIFBNTm9kZSkubm9kZVNpemUsXHJcbiAgICAgICAgKG5vZGUsIHBvcykgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIW5vZGVIYXNNb3JlQ29udGVudCAmJiBub2RlLnR5cGUgPT09IGhhcmRCcmVhaykge1xyXG4gICAgICAgICAgICAgICAgbm9kZUhhc01vcmVDb250ZW50ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRyID0gdHIuc3BsaXQocG9zICsgMSkuZGVsZXRlKHBvcywgcG9zICsgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgKTtcclxuICAgIGlmIChub2RlSGFzTW9yZUNvbnRlbnQpIHtcclxuICAgICAgICBjdXJyZW50Tm9kZSA9IHRyLmRvYy5ub2RlQXQoc3RhcnQgKyAxKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDcmVhdGUgbmV3IG5vZGUgYW5kIGZpbGwgd2l0aCBjb250ZW50IG9mIGN1cnJlbnQgbm9kZS5cclxuICAgIGNvbnN0IHsgYmxvY2txdW90ZSwgcGFyYWdyYXBoIH0gPSBzdGF0ZS5zY2hlbWEubm9kZXM7XHJcbiAgICBsZXQgY29udGVudDtcclxuICAgIGxldCBkZXB0aDtcclxuICAgIGlmIChub2RlVHlwZSA9PT0gYmxvY2txdW90ZSkge1xyXG4gICAgICAgIGRlcHRoID0gMztcclxuICAgICAgICBjb250ZW50ID0gW3BhcmFncmFwaC5jcmVhdGUoe30sIChjdXJyZW50Tm9kZSBhcyBQTU5vZGUpLmNvbnRlbnQpXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZGVwdGggPSAyO1xyXG4gICAgICAgIGNvbnRlbnQgPSAoY3VycmVudE5vZGUgYXMgUE1Ob2RlKS5jb250ZW50O1xyXG4gICAgfVxyXG4gICAgY29uc3QgbmV3Tm9kZSA9IG5vZGVUeXBlLmNyZWF0ZShhdHRycywgY29udGVudCk7XHJcblxyXG4gICAgLy8gQWRkIG5ldyBub2RlLlxyXG4gICAgdHIgPSB0clxyXG4gICAgICAgIC5zZXRTZWxlY3Rpb24obmV3IE5vZGVTZWxlY3Rpb24odHIuZG9jLnJlc29sdmUoc3RhcnQgKyAxKSkpXHJcbiAgICAgICAgLnJlcGxhY2VTZWxlY3Rpb25XaXRoKG5ld05vZGUpXHJcbiAgICAgICAgLnNldFNlbGVjdGlvbihuZXcgVGV4dFNlbGVjdGlvbih0ci5kb2MucmVzb2x2ZShzdGFydCArIGRlcHRoKSkpO1xyXG4gICAgcmV0dXJuIHRyO1xyXG59O1xyXG4iXX0=