UNPKG

ngx-editor

Version:

The Rich Text Editor for Angular, Built on ProseMirror

60 lines 7.8 kB
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==