UNPKG

ngx-editor

Version:

Rich Text Editor for angular using ProseMirror

45 lines 6.29 kB
import { Plugin, PluginKey } from 'prosemirror-state'; import { DecorationSet, Decoration } from 'prosemirror-view'; const PLACEHOLDER_CLASSNAME = 'NgxEditor__Placeholder'; const placeholderPlugin = (text) => { return new Plugin({ key: new PluginKey('placeholder'), state: { init() { return text ?? ''; }, apply(tr, previousVal) { const placeholder = tr.getMeta('UPDATE_PLACEHOLDER') ?? previousVal; return placeholder; }, }, props: { decorations(state) { const { doc } = state; const { textContent, childCount } = doc; const placeholder = this.getState(state); if (!placeholder || childCount > 1) { return DecorationSet.empty; } const decorations = []; const decorate = (node, pos) => { if (node.type.isBlock && node.childCount === 0 && textContent.length === 0) { const from = pos; const to = pos + node.nodeSize; const placeholderNode = Decoration.node(from, to, { 'class': PLACEHOLDER_CLASSNAME, 'data-placeholder': placeholder, 'data-align': node.attrs['align'] ?? null, }); decorations.push(placeholderNode); } return false; }; doc.descendants(decorate); return DecorationSet.create(doc, decorations); }, }, }); }; export default placeholderPlugin; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2Vob2xkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZWRpdG9yL3NyYy9saWIvcGx1Z2lucy9wbGFjZWhvbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFlLFNBQVMsRUFBZSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFHN0QsTUFBTSxxQkFBcUIsR0FBRyx3QkFBd0IsQ0FBQztBQUV2RCxNQUFNLGlCQUFpQixHQUFHLENBQUMsSUFBYSxFQUFVLEVBQUU7SUFDbEQsT0FBTyxJQUFJLE1BQU0sQ0FBQztRQUNoQixHQUFHLEVBQUUsSUFBSSxTQUFTLENBQUMsYUFBYSxDQUFDO1FBQ2pDLEtBQUssRUFBRTtZQUNMLElBQUk7Z0JBQ0YsT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3BCLENBQUM7WUFDRCxLQUFLLENBQUMsRUFBZSxFQUFFLFdBQW1CO2dCQUN4QyxNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLElBQUksV0FBVyxDQUFDO2dCQUNwRSxPQUFPLFdBQVcsQ0FBQztZQUNyQixDQUFDO1NBQ0Y7UUFDRCxLQUFLLEVBQUU7WUFDTCxXQUFXLENBQUMsS0FBa0I7Z0JBQzVCLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUM7Z0JBQ3RCLE1BQU0sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLEdBQUcsR0FBRyxDQUFDO2dCQUV4QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUV6QyxJQUFJLENBQUMsV0FBVyxJQUFJLFVBQVUsR0FBRyxDQUFDLEVBQUU7b0JBQ2xDLE9BQU8sYUFBYSxDQUFDLEtBQUssQ0FBQztpQkFDNUI7Z0JBRUQsTUFBTSxXQUFXLEdBQWlCLEVBQUUsQ0FBQztnQkFFckMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFxQixFQUFFLEdBQVcsRUFBRSxFQUFFO29CQUN0RCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssQ0FBQyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO3dCQUMxRSxNQUFNLElBQUksR0FBRyxHQUFHLENBQUM7d0JBQ2pCLE1BQU0sRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO3dCQUUvQixNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUU7NEJBQ2hELE9BQU8sRUFBRSxxQkFBcUI7NEJBQzlCLGtCQUFrQixFQUFFLFdBQVc7NEJBQy9CLFlBQVksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUk7eUJBQzFDLENBQUMsQ0FBQzt3QkFFSCxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO3FCQUNuQztvQkFFRCxPQUFPLEtBQUssQ0FBQztnQkFDZixDQUFDLENBQUM7Z0JBRUYsR0FBRyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDMUIsT0FBTyxhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUNoRCxDQUFDO1NBQ0Y7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFFRixlQUFlLGlCQUFpQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGx1Z2luLCBFZGl0b3JTdGF0ZSwgUGx1Z2luS2V5LCBUcmFuc2FjdGlvbiB9IGZyb20gJ3Byb3NlbWlycm9yLXN0YXRlJztcbmltcG9ydCB7IERlY29yYXRpb25TZXQsIERlY29yYXRpb24gfSBmcm9tICdwcm9zZW1pcnJvci12aWV3JztcbmltcG9ydCB7IE5vZGUgYXMgUHJvc2VNaXJyb3JOb2RlIH0gZnJvbSAncHJvc2VtaXJyb3ItbW9kZWwnO1xuXG5jb25zdCBQTEFDRUhPTERFUl9DTEFTU05BTUUgPSAnTmd4RWRpdG9yX19QbGFjZWhvbGRlcic7XG5cbmNvbnN0IHBsYWNlaG9sZGVyUGx1Z2luID0gKHRleHQ/OiBzdHJpbmcpOiBQbHVnaW4gPT4ge1xuICByZXR1cm4gbmV3IFBsdWdpbih7XG4gICAga2V5OiBuZXcgUGx1Z2luS2V5KCdwbGFjZWhvbGRlcicpLFxuICAgIHN0YXRlOiB7XG4gICAgICBpbml0KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0ZXh0ID8/ICcnO1xuICAgICAgfSxcbiAgICAgIGFwcGx5KHRyOiBUcmFuc2FjdGlvbiwgcHJldmlvdXNWYWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gdHIuZ2V0TWV0YSgnVVBEQVRFX1BMQUNFSE9MREVSJykgPz8gcHJldmlvdXNWYWw7XG4gICAgICAgIHJldHVybiBwbGFjZWhvbGRlcjtcbiAgICAgIH0sXG4gICAgfSxcbiAgICBwcm9wczoge1xuICAgICAgZGVjb3JhdGlvbnMoc3RhdGU6IEVkaXRvclN0YXRlKTogRGVjb3JhdGlvblNldCB7XG4gICAgICAgIGNvbnN0IHsgZG9jIH0gPSBzdGF0ZTtcbiAgICAgICAgY29uc3QgeyB0ZXh0Q29udGVudCwgY2hpbGRDb3VudCB9ID0gZG9jO1xuXG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gdGhpcy5nZXRTdGF0ZShzdGF0ZSk7XG5cbiAgICAgICAgaWYgKCFwbGFjZWhvbGRlciB8fCBjaGlsZENvdW50ID4gMSkge1xuICAgICAgICAgIHJldHVybiBEZWNvcmF0aW9uU2V0LmVtcHR5O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVjb3JhdGlvbnM6IERlY29yYXRpb25bXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGRlY29yYXRlID0gKG5vZGU6IFByb3NlTWlycm9yTm9kZSwgcG9zOiBudW1iZXIpID0+IHtcbiAgICAgICAgICBpZiAobm9kZS50eXBlLmlzQmxvY2sgJiYgbm9kZS5jaGlsZENvdW50ID09PSAwICYmIHRleHRDb250ZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgZnJvbSA9IHBvcztcbiAgICAgICAgICAgIGNvbnN0IHRvID0gcG9zICsgbm9kZS5ub2RlU2l6ZTtcblxuICAgICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJOb2RlID0gRGVjb3JhdGlvbi5ub2RlKGZyb20sIHRvLCB7XG4gICAgICAgICAgICAgICdjbGFzcyc6IFBMQUNFSE9MREVSX0NMQVNTTkFNRSxcbiAgICAgICAgICAgICAgJ2RhdGEtcGxhY2Vob2xkZXInOiBwbGFjZWhvbGRlcixcbiAgICAgICAgICAgICAgJ2RhdGEtYWxpZ24nOiBub2RlLmF0dHJzWydhbGlnbiddID8/IG51bGwsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZGVjb3JhdGlvbnMucHVzaChwbGFjZWhvbGRlck5vZGUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcblxuICAgICAgICBkb2MuZGVzY2VuZGFudHMoZGVjb3JhdGUpO1xuICAgICAgICByZXR1cm4gRGVjb3JhdGlvblNldC5jcmVhdGUoZG9jLCBkZWNvcmF0aW9ucyk7XG4gICAgICB9LFxuICAgIH0sXG4gIH0pO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcGxhY2Vob2xkZXJQbHVnaW47XG4iXX0=