ngx-editor
Version:
Rich Text Editor for angular using ProseMirror
64 lines • 8.5 kB
JavaScript
import { getSelectionMarks, isMarkActive } from 'ngx-editor/helpers';
import { applyMark, removeMark } from 'ngx-editor/commands';
class TextColor {
constructor(name, attrName = 'color') {
this.name = name;
this.attrName = attrName;
}
apply(attrs) {
return (state, dispatch) => {
const { schema, selection, doc } = state;
const type = schema.marks[this.name];
if (!type) {
return false;
}
const { from, to, empty } = selection;
if (!empty && (from + 1 === to)) {
const node = doc.nodeAt(from);
if (node?.isAtom && !node.isText && node.isLeaf) {
// An atomic node (e.g. Image) is selected.
return false;
}
}
return applyMark(type, attrs)(state, dispatch);
};
}
isActive(state) {
const { schema } = state;
const type = schema.marks[this.name];
if (!type) {
return false;
}
return isMarkActive(state, type);
}
getActiveColors(state) {
if (!this.isActive(state)) {
return [];
}
const { schema } = state;
const marks = getSelectionMarks(state);
const colors = marks
.filter((mark) => mark.type === schema.marks[this.name])
.map((mark) => {
return mark.attrs[this.attrName];
})
.filter(Boolean);
return colors;
}
remove() {
return (state, dispatch) => {
const { schema } = state;
const type = schema.marks[this.name];
if (!type) {
return false;
}
return removeMark(type)(state, dispatch);
};
}
canExecute(state) {
const attrs = this.name === 'text_color' ? { color: '' } : { backgroundColor: '' };
return this.apply(attrs)(state);
}
}
export default TextColor;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGV4dENvbG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWVkaXRvci9zcmMvbGliL2NvbW1hbmRzL1RleHRDb2xvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckUsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQWU1RCxNQUFNLFNBQVM7SUFJYixZQUFZLElBQVUsRUFBRSxXQUFxQixPQUFPO1FBQ2xELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFFRCxLQUFLLENBQUMsS0FBd0M7UUFDNUMsT0FBTyxDQUFDLEtBQWtCLEVBQUUsUUFBbUIsRUFBVyxFQUFFO1lBQzFELE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQztZQUV6QyxNQUFNLElBQUksR0FBYSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNULE9BQU8sS0FBSyxDQUFDO2FBQ2Q7WUFFRCxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxTQUFTLENBQUM7WUFFdEMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUU7Z0JBQy9CLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzlCLElBQUksSUFBSSxFQUFFLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtvQkFDL0MsMkNBQTJDO29CQUMzQyxPQUFPLEtBQUssQ0FBQztpQkFDZDthQUNGO1lBRUQsT0FBTyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNqRCxDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQWtCO1FBQ3pCLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUM7UUFDekIsTUFBTSxJQUFJLEdBQWEsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFL0MsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNULE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxPQUFPLFlBQVksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFrQjtRQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN6QixPQUFPLEVBQUUsQ0FBQztTQUNYO1FBRUQsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQztRQUN6QixNQUFNLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV2QyxNQUFNLE1BQU0sR0FBRyxLQUFLO2FBQ2pCLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN2RCxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNaLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDO2FBQ0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRW5CLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxNQUFNO1FBQ0osT0FBTyxDQUFDLEtBQWtCLEVBQUUsUUFBbUIsRUFBVyxFQUFFO1lBQzFELE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUM7WUFFekIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDVCxPQUFPLEtBQUssQ0FBQzthQUNkO1lBRUQsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRCxVQUFVLENBQUMsS0FBa0I7UUFDM0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUNuRixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEMsQ0FBQztDQUNGO0FBRUQsZUFBZSxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXJrVHlwZSB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcbmltcG9ydCB7IEVkaXRvclN0YXRlIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ3Byb3NlbWlycm9yLWNvbW1hbmRzJztcblxuaW1wb3J0IHsgZ2V0U2VsZWN0aW9uTWFya3MsIGlzTWFya0FjdGl2ZSB9IGZyb20gJ25neC1lZGl0b3IvaGVscGVycyc7XG5pbXBvcnQgeyBhcHBseU1hcmssIHJlbW92ZU1hcmsgfSBmcm9tICduZ3gtZWRpdG9yL2NvbW1hbmRzJztcblxuaW1wb3J0IHsgRGlzcGF0Y2ggfSBmcm9tICcuL3R5cGVzJztcblxudHlwZSBOYW1lID0gJ3RleHRfY29sb3InIHwgJ3RleHRfYmFja2dyb3VuZF9jb2xvcic7XG50eXBlIEF0dHJOYW1lID0gJ2NvbG9yJyB8ICdiYWNrZ3JvdW5kQ29sb3InO1xuXG5pbnRlcmZhY2UgQ29sb3JBdHRycyB7XG4gIGNvbG9yOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBCYWNrZ3JvdW5kQ29sb3JBdHRycyB7XG4gIGJhY2tncm91bmRDb2xvcjogc3RyaW5nO1xufVxuXG5jbGFzcyBUZXh0Q29sb3Ige1xuICBuYW1lOiBOYW1lO1xuICBhdHRyTmFtZTogQXR0ck5hbWU7XG5cbiAgY29uc3RydWN0b3IobmFtZTogTmFtZSwgYXR0ck5hbWU6IEF0dHJOYW1lID0gJ2NvbG9yJykge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5hdHRyTmFtZSA9IGF0dHJOYW1lO1xuICB9XG5cbiAgYXBwbHkoYXR0cnM6IENvbG9yQXR0cnMgfCBCYWNrZ3JvdW5kQ29sb3JBdHRycyk6IENvbW1hbmQge1xuICAgIHJldHVybiAoc3RhdGU6IEVkaXRvclN0YXRlLCBkaXNwYXRjaD86IERpc3BhdGNoKTogYm9vbGVhbiA9PiB7XG4gICAgICBjb25zdCB7IHNjaGVtYSwgc2VsZWN0aW9uLCBkb2MgfSA9IHN0YXRlO1xuXG4gICAgICBjb25zdCB0eXBlOiBNYXJrVHlwZSA9IHNjaGVtYS5tYXJrc1t0aGlzLm5hbWVdO1xuICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBmcm9tLCB0bywgZW1wdHkgfSA9IHNlbGVjdGlvbjtcblxuICAgICAgaWYgKCFlbXB0eSAmJiAoZnJvbSArIDEgPT09IHRvKSkge1xuICAgICAgICBjb25zdCBub2RlID0gZG9jLm5vZGVBdChmcm9tKTtcbiAgICAgICAgaWYgKG5vZGU/LmlzQXRvbSAmJiAhbm9kZS5pc1RleHQgJiYgbm9kZS5pc0xlYWYpIHtcbiAgICAgICAgICAvLyBBbiBhdG9taWMgbm9kZSAoZS5nLiBJbWFnZSkgaXMgc2VsZWN0ZWQuXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhcHBseU1hcmsodHlwZSwgYXR0cnMpKHN0YXRlLCBkaXNwYXRjaCk7XG4gICAgfTtcbiAgfVxuXG4gIGlzQWN0aXZlKHN0YXRlOiBFZGl0b3JTdGF0ZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHsgc2NoZW1hIH0gPSBzdGF0ZTtcbiAgICBjb25zdCB0eXBlOiBNYXJrVHlwZSA9IHNjaGVtYS5tYXJrc1t0aGlzLm5hbWVdO1xuXG4gICAgaWYgKCF0eXBlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzTWFya0FjdGl2ZShzdGF0ZSwgdHlwZSk7XG4gIH1cblxuICBnZXRBY3RpdmVDb2xvcnMoc3RhdGU6IEVkaXRvclN0YXRlKTogc3RyaW5nW10ge1xuICAgIGlmICghdGhpcy5pc0FjdGl2ZShzdGF0ZSkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHNjaGVtYSB9ID0gc3RhdGU7XG4gICAgY29uc3QgbWFya3MgPSBnZXRTZWxlY3Rpb25NYXJrcyhzdGF0ZSk7XG5cbiAgICBjb25zdCBjb2xvcnMgPSBtYXJrc1xuICAgICAgLmZpbHRlcigobWFyaykgPT4gbWFyay50eXBlID09PSBzY2hlbWEubWFya3NbdGhpcy5uYW1lXSlcbiAgICAgIC5tYXAoKG1hcmspID0+IHtcbiAgICAgICAgcmV0dXJuIG1hcmsuYXR0cnNbdGhpcy5hdHRyTmFtZV07XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihCb29sZWFuKTtcblxuICAgIHJldHVybiBjb2xvcnM7XG4gIH1cblxuICByZW1vdmUoKTogQ29tbWFuZCB7XG4gICAgcmV0dXJuIChzdGF0ZTogRWRpdG9yU3RhdGUsIGRpc3BhdGNoPzogRGlzcGF0Y2gpOiBib29sZWFuID0+IHtcbiAgICAgIGNvbnN0IHsgc2NoZW1hIH0gPSBzdGF0ZTtcblxuICAgICAgY29uc3QgdHlwZSA9IHNjaGVtYS5tYXJrc1t0aGlzLm5hbWVdO1xuICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlbW92ZU1hcmsodHlwZSkoc3RhdGUsIGRpc3BhdGNoKTtcbiAgICB9O1xuICB9XG5cbiAgY2FuRXhlY3V0ZShzdGF0ZTogRWRpdG9yU3RhdGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBhdHRycyA9IHRoaXMubmFtZSA9PT0gJ3RleHRfY29sb3InID8geyBjb2xvcjogJycgfSA6IHsgYmFja2dyb3VuZENvbG9yOiAnJyB9O1xuICAgIHJldHVybiB0aGlzLmFwcGx5KGF0dHJzKShzdGF0ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVGV4dENvbG9yO1xuIl19