ngx-editor
Version:
Rich Text Editor for angular using ProseMirror
60 lines • 7.63 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGVhZGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1lZGl0b3Ivc3JjL2xpYi9jb21tYW5kcy9IZWFkaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBZ0IsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFJdkQsTUFBTSxPQUFPO0lBR1gsWUFBWSxLQUFvQjtRQUM5QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBRUQsS0FBSztRQUNILE9BQU8sQ0FBQyxLQUFrQixFQUFFLFFBQW9DLEVBQVcsRUFBRTtZQUMzRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDO1lBRXpCLE1BQU0sSUFBSSxHQUFhLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQzVDLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ1QsT0FBTyxLQUFLLENBQUM7YUFDZDtZQUVELE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU8sQ0FBQyxLQUFrQixFQUFFLFFBQW9DLEVBQVcsRUFBRTtZQUMzRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUM7WUFFekMsTUFBTSxJQUFJLEdBQWEsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDNUMsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDVCxPQUFPLEtBQUssQ0FBQzthQUNkO1lBRUQsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUMsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUVqQyxNQUFNLEtBQUssR0FBRyxJQUFJLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUVoQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3hCLE9BQU8sWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQzthQUNyRTtZQUVELE9BQU8sWUFBWSxDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDOUUsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFrQjtRQUN6QixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLE1BQU0sZ0JBQWdCLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbEQsTUFBTSxJQUFJLEdBQWEsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDNUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNULE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxNQUFNLGNBQWMsR0FBRztZQUNyQixJQUFJO1lBQ0osTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJO1lBQ2pCLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVTtTQUN4QixDQUFDO1FBRUYseUJBQXlCO1FBQ3pCLDhDQUE4QztRQUM5QyxNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUM3QyxPQUFPLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQXFCLEVBQUUsRUFBRTtZQUN0RCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQztRQUM1QyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxVQUFVLENBQUMsS0FBa0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQztDQUNGO0FBRUQsZUFBZSxPQUFPLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IE5vZGVUeXBlLCBOb2RlIGFzIFByb3NlTWlycm9yTm9kZSB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcbmltcG9ydCB0eXBlIHsgRWRpdG9yU3RhdGUsIFRyYW5zYWN0aW9uIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuaW1wb3J0IHsgdHlwZSBDb21tYW5kLCBzZXRCbG9ja1R5cGUgfSBmcm9tICdwcm9zZW1pcnJvci1jb21tYW5kcyc7XG5cbmltcG9ydCB7IGdldFNlbGVjdGlvbk5vZGVzIH0gZnJvbSAnbmd4LWVkaXRvci9oZWxwZXJzJztcblxuZXhwb3J0IHR5cGUgSGVhZGluZ0xldmVscyA9IDEgfCAyIHwgMyB8IDQgfCA1IHwgNjtcblxuY2xhc3MgSGVhZGluZyB7XG4gIGxldmVsOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IobGV2ZWw6IEhlYWRpbmdMZXZlbHMpIHtcbiAgICB0aGlzLmxldmVsID0gbGV2ZWw7XG4gIH1cblxuICBhcHBseSgpOiBDb21tYW5kIHtcbiAgICByZXR1cm4gKHN0YXRlOiBFZGl0b3JTdGF0ZSwgZGlzcGF0Y2g/OiAodHI6IFRyYW5zYWN0aW9uKSA9PiB2b2lkKTogYm9vbGVhbiA9PiB7XG4gICAgICBjb25zdCB7IHNjaGVtYSB9ID0gc3RhdGU7XG5cbiAgICAgIGNvbnN0IHR5cGU6IE5vZGVUeXBlID0gc2NoZW1hLm5vZGVzLmhlYWRpbmc7XG4gICAgICBpZiAoIXR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2V0QmxvY2tUeXBlKHR5cGUpKHN0YXRlLCBkaXNwYXRjaCk7XG4gICAgfTtcbiAgfVxuXG4gIHRvZ2dsZSgpOiBDb21tYW5kIHtcbiAgICByZXR1cm4gKHN0YXRlOiBFZGl0b3JTdGF0ZSwgZGlzcGF0Y2g/OiAodHI6IFRyYW5zYWN0aW9uKSA9PiB2b2lkKTogYm9vbGVhbiA9PiB7XG4gICAgICBjb25zdCB7IHNjaGVtYSwgc2VsZWN0aW9uLCBkb2MgfSA9IHN0YXRlO1xuXG4gICAgICBjb25zdCB0eXBlOiBOb2RlVHlwZSA9IHNjaGVtYS5ub2Rlcy5oZWFkaW5nO1xuICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9kZVBvcyA9IHNlbGVjdGlvbi4kZnJvbS5iZWZvcmUoMSk7XG4gICAgICBjb25zdCBub2RlID0gZG9jLm5vZGVBdChub2RlUG9zKTtcblxuICAgICAgY29uc3QgYXR0cnMgPSBub2RlPy5hdHRycyA/PyB7fTtcblxuICAgICAgaWYgKHRoaXMuaXNBY3RpdmUoc3RhdGUpKSB7XG4gICAgICAgIHJldHVybiBzZXRCbG9ja1R5cGUoc2NoZW1hLm5vZGVzLnBhcmFncmFwaCwgYXR0cnMpKHN0YXRlLCBkaXNwYXRjaCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZXRCbG9ja1R5cGUodHlwZSwgeyAuLi5hdHRycywgbGV2ZWw6IHRoaXMubGV2ZWwgfSkoc3RhdGUsIGRpc3BhdGNoKTtcbiAgICB9O1xuICB9XG5cbiAgaXNBY3RpdmUoc3RhdGU6IEVkaXRvclN0YXRlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyBzY2hlbWEgfSA9IHN0YXRlO1xuICAgIGNvbnN0IG5vZGVzSW5TZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb25Ob2RlcyhzdGF0ZSk7XG5cbiAgICBjb25zdCB0eXBlOiBOb2RlVHlwZSA9IHNjaGVtYS5ub2Rlcy5oZWFkaW5nO1xuICAgIGlmICghdHlwZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHN1cHBvcnRlZE5vZGVzID0gW1xuICAgICAgdHlwZSxcbiAgICAgIHNjaGVtYS5ub2Rlcy50ZXh0LFxuICAgICAgc2NoZW1hLm5vZGVzLmJsb2NrcXVvdGUsXG4gICAgXTtcblxuICAgIC8vIGhlYWRpbmcgaXMgYSB0ZXh0IG5vZGVcbiAgICAvLyBkb24ndCBtYXJrIGFzIGFjdGl2ZSB3aGVuIGl0IGhhcyBtb3JlIG5vZGVzXG4gICAgY29uc3Qgbm9kZXMgPSBub2Rlc0luU2VsZWN0aW9uLmZpbHRlcigobm9kZSkgPT4ge1xuICAgICAgcmV0dXJuIHN1cHBvcnRlZE5vZGVzLmluY2x1ZGVzKG5vZGUudHlwZSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBhY2l0dmVOb2RlID0gbm9kZXMuZmluZCgobm9kZTogUHJvc2VNaXJyb3JOb2RlKSA9PiB7XG4gICAgICByZXR1cm4gbm9kZS5hdHRyc1snbGV2ZWwnXSA9PT0gdGhpcy5sZXZlbDtcbiAgICB9KTtcblxuICAgIHJldHVybiBCb29sZWFuKGFjaXR2ZU5vZGUpO1xuICB9XG5cbiAgY2FuRXhlY3V0ZShzdGF0ZTogRWRpdG9yU3RhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50b2dnbGUoKShzdGF0ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSGVhZGluZztcbiJdfQ==