ngx-editor
Version:
The Rich Text Editor for Angular, Built on ProseMirror
60 lines • 7.8 kB
JavaScript
import { setBlockType } from 'prosemirror-commands';
import { getSelectionNodes } from 'ngx-editor/helpers';
class Heading {
constructor(level) {
this.level = level;
}
apply() {
return (state, dispatch) => {
const { schema } = state;
const type = schema.nodes['heading'];
if (!type) {
return false;
}
return setBlockType(type)(state, dispatch);
};
}
toggle() {
return (state, dispatch) => {
const { schema, selection, doc } = state;
const type = schema.nodes['heading'];
if (!type) {
return false;
}
const nodePos = selection.$from.before(1);
const node = doc.nodeAt(nodePos);
const attrs = node?.attrs ?? {};
if (this.isActive(state)) {
return setBlockType(schema.nodes['paragraph'], attrs)(state, dispatch);
}
return setBlockType(type, { ...attrs, level: this.level })(state, dispatch);
};
}
isActive(state) {
const { schema } = state;
const nodesInSelection = getSelectionNodes(state);
const type = schema.nodes['heading'];
if (!type) {
return false;
}
const supportedNodes = [
type,
schema.nodes['text'],
schema.nodes['blockquote'],
];
// heading is a text node
// don't mark as active when it has more nodes
const nodes = nodesInSelection.filter((node) => {
return supportedNodes.includes(node.type);
});
const acitveNode = nodes.find((node) => {
return node.attrs['level'] === this.level;
});
return Boolean(acitveNode);
}
canExecute(state) {
return this.toggle()(state);
}
}
export default Heading;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGVhZGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1lZGl0b3Ivc3JjL2xpYi9jb21tYW5kcy9IZWFkaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVwRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQU12RCxNQUFNLE9BQU87SUFHWCxZQUFZLEtBQW9CO1FBQzlCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxLQUFLO1FBQ0gsT0FBTyxDQUFDLEtBQWtCLEVBQUUsUUFBb0MsRUFBVyxFQUFFO1lBQzNFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUM7WUFFekIsTUFBTSxJQUFJLEdBQWEsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNULE9BQU8sS0FBSyxDQUFDO2FBQ2Q7WUFFRCxPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDN0MsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU07UUFDSixPQUFPLENBQUMsS0FBa0IsRUFBRSxRQUFvQyxFQUFXLEVBQUU7WUFDM0UsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDO1lBRXpDLE1BQU0sSUFBSSxHQUFhLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDVCxPQUFPLEtBQUssQ0FBQzthQUNkO1lBRUQsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUMsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUVqQyxNQUFNLEtBQUssR0FBRyxJQUFJLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUVoQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3hCLE9BQU8sWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQ3hFO1lBRUQsT0FBTyxZQUFZLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM5RSxDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQWtCO1FBQ3pCLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUM7UUFDekIsTUFBTSxnQkFBZ0IsR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVsRCxNQUFNLElBQUksR0FBYSxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsTUFBTSxjQUFjLEdBQUc7WUFDckIsSUFBSTtZQUNKLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ3BCLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO1NBQzNCLENBQUM7UUFFRix5QkFBeUI7UUFDekIsOENBQThDO1FBQzlDLE1BQU0sS0FBSyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQzdDLE9BQU8sY0FBYyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBcUIsRUFBRSxFQUFFO1lBQ3RELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFrQjtRQUMzQixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDO0NBQ0Y7QUFFRCxlQUFlLE9BQU8sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTm9kZVR5cGUsIE5vZGUgYXMgUHJvc2VNaXJyb3JOb2RlIH0gZnJvbSAncHJvc2VtaXJyb3ItbW9kZWwnO1xuaW1wb3J0IHR5cGUgeyBFZGl0b3JTdGF0ZSwgVHJhbnNhY3Rpb24sIENvbW1hbmQgfSBmcm9tICdwcm9zZW1pcnJvci1zdGF0ZSc7XG5pbXBvcnQgeyBzZXRCbG9ja1R5cGUgfSBmcm9tICdwcm9zZW1pcnJvci1jb21tYW5kcyc7XG5cbmltcG9ydCB7IGdldFNlbGVjdGlvbk5vZGVzIH0gZnJvbSAnbmd4LWVkaXRvci9oZWxwZXJzJztcblxuaW1wb3J0IHsgVG9nZ2xlQ29tbWFuZCB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBIZWFkaW5nTGV2ZWxzID0gMSB8IDIgfCAzIHwgNCB8IDUgfCA2O1xuXG5jbGFzcyBIZWFkaW5nIGltcGxlbWVudHMgVG9nZ2xlQ29tbWFuZCB7XG4gIGxldmVsOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IobGV2ZWw6IEhlYWRpbmdMZXZlbHMpIHtcbiAgICB0aGlzLmxldmVsID0gbGV2ZWw7XG4gIH1cblxuICBhcHBseSgpOiBDb21tYW5kIHtcbiAgICByZXR1cm4gKHN0YXRlOiBFZGl0b3JTdGF0ZSwgZGlzcGF0Y2g/OiAodHI6IFRyYW5zYWN0aW9uKSA9PiB2b2lkKTogYm9vbGVhbiA9PiB7XG4gICAgICBjb25zdCB7IHNjaGVtYSB9ID0gc3RhdGU7XG5cbiAgICAgIGNvbnN0IHR5cGU6IE5vZGVUeXBlID0gc2NoZW1hLm5vZGVzWydoZWFkaW5nJ107XG4gICAgICBpZiAoIXR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2V0QmxvY2tUeXBlKHR5cGUpKHN0YXRlLCBkaXNwYXRjaCk7XG4gICAgfTtcbiAgfVxuXG4gIHRvZ2dsZSgpOiBDb21tYW5kIHtcbiAgICByZXR1cm4gKHN0YXRlOiBFZGl0b3JTdGF0ZSwgZGlzcGF0Y2g/OiAodHI6IFRyYW5zYWN0aW9uKSA9PiB2b2lkKTogYm9vbGVhbiA9PiB7XG4gICAgICBjb25zdCB7IHNjaGVtYSwgc2VsZWN0aW9uLCBkb2MgfSA9IHN0YXRlO1xuXG4gICAgICBjb25zdCB0eXBlOiBOb2RlVHlwZSA9IHNjaGVtYS5ub2Rlc1snaGVhZGluZyddO1xuICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9kZVBvcyA9IHNlbGVjdGlvbi4kZnJvbS5iZWZvcmUoMSk7XG4gICAgICBjb25zdCBub2RlID0gZG9jLm5vZGVBdChub2RlUG9zKTtcblxuICAgICAgY29uc3QgYXR0cnMgPSBub2RlPy5hdHRycyA/PyB7fTtcblxuICAgICAgaWYgKHRoaXMuaXNBY3RpdmUoc3RhdGUpKSB7XG4gICAgICAgIHJldHVybiBzZXRCbG9ja1R5cGUoc2NoZW1hLm5vZGVzWydwYXJhZ3JhcGgnXSwgYXR0cnMpKHN0YXRlLCBkaXNwYXRjaCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZXRCbG9ja1R5cGUodHlwZSwgeyAuLi5hdHRycywgbGV2ZWw6IHRoaXMubGV2ZWwgfSkoc3RhdGUsIGRpc3BhdGNoKTtcbiAgICB9O1xuICB9XG5cbiAgaXNBY3RpdmUoc3RhdGU6IEVkaXRvclN0YXRlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyBzY2hlbWEgfSA9IHN0YXRlO1xuICAgIGNvbnN0IG5vZGVzSW5TZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb25Ob2RlcyhzdGF0ZSk7XG5cbiAgICBjb25zdCB0eXBlOiBOb2RlVHlwZSA9IHNjaGVtYS5ub2Rlc1snaGVhZGluZyddO1xuICAgIGlmICghdHlwZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHN1cHBvcnRlZE5vZGVzID0gW1xuICAgICAgdHlwZSxcbiAgICAgIHNjaGVtYS5ub2Rlc1sndGV4dCddLFxuICAgICAgc2NoZW1hLm5vZGVzWydibG9ja3F1b3RlJ10sXG4gICAgXTtcblxuICAgIC8vIGhlYWRpbmcgaXMgYSB0ZXh0IG5vZGVcbiAgICAvLyBkb24ndCBtYXJrIGFzIGFjdGl2ZSB3aGVuIGl0IGhhcyBtb3JlIG5vZGVzXG4gICAgY29uc3Qgbm9kZXMgPSBub2Rlc0luU2VsZWN0aW9uLmZpbHRlcigobm9kZSkgPT4ge1xuICAgICAgcmV0dXJuIHN1cHBvcnRlZE5vZGVzLmluY2x1ZGVzKG5vZGUudHlwZSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBhY2l0dmVOb2RlID0gbm9kZXMuZmluZCgobm9kZTogUHJvc2VNaXJyb3JOb2RlKSA9PiB7XG4gICAgICByZXR1cm4gbm9kZS5hdHRyc1snbGV2ZWwnXSA9PT0gdGhpcy5sZXZlbDtcbiAgICB9KTtcblxuICAgIHJldHVybiBCb29sZWFuKGFjaXR2ZU5vZGUpO1xuICB9XG5cbiAgY2FuRXhlY3V0ZShzdGF0ZTogRWRpdG9yU3RhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50b2dnbGUoKShzdGF0ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSGVhZGluZztcbiJdfQ==