UNPKG

ngx-editor

Version:

Rich Text Editor for angular using ProseMirror

107 lines 13.1 kB
import { EditorState } from 'prosemirror-state'; import { EditorView } from 'prosemirror-view'; import { Subject } from 'rxjs'; import { isNil } from 'ngx-editor/utils'; import EditorCommands from './EditorCommands'; import defautlSchema from './schema'; import { parseContent } from './parsers'; import getDefaultPlugins from './defaultPlugins'; const defaultFeatures = { linkOnPaste: true, resizeImage: true, }; const DEFAULT_OPTIONS = { content: null, history: true, keyboardShortcuts: true, inputRules: true, schema: defautlSchema, plugins: [], nodeViews: {}, attributes: {}, features: defaultFeatures, }; class Editor { constructor(options = DEFAULT_OPTIONS) { this.valueChangesSubject = new Subject(); this.updateSubject = new Subject(); this.options = { ...DEFAULT_OPTIONS, ...options }; this.createEditor(); } get valueChanges() { return this.valueChangesSubject.asObservable(); } get update() { return this.updateSubject.asObservable(); } get schema() { return this.options.schema || defautlSchema; } get commands() { return new EditorCommands(this.view); } get features() { return { ...defaultFeatures, ...this.options.features }; } handleTransactions(tr) { const state = this.view.state.apply(tr); this.view.updateState(state); this.updateSubject.next(this.view); if (!tr.docChanged && !tr.getMeta('FORCE_EMIT')) { return; } const json = state.doc.toJSON(); this.valueChangesSubject.next(json); } createEditor() { const { options, schema } = this; const { content = null, nodeViews } = options; const { history = true, keyboardShortcuts = true, inputRules = true } = options; const doc = parseContent(content, schema); const plugins = options.plugins ?? []; const attributes = options.attributes ?? {}; const defaultPlugins = getDefaultPlugins(schema, { history, keyboardShortcuts, inputRules, }); this.view = new EditorView(null, { state: EditorState.create({ doc, schema, plugins: [...defaultPlugins, ...plugins], }), nodeViews, dispatchTransaction: this.handleTransactions.bind(this), attributes, }); } setContent(content) { if (isNil(content)) { return; } const { state } = this.view; const { tr, doc } = state; const newDoc = parseContent(content, this.schema); tr.replaceWith(0, state.doc.content.size, newDoc); // don't emit if both content is same if (doc.eq(tr.doc)) { return; } if (!tr.docChanged) { return; } this.view.dispatch(tr); } registerPlugin(plugin) { const { state } = this.view; const plugins = [...state.plugins, plugin]; const newState = state.reconfigure({ plugins }); this.view.updateState(newState); } destroy() { this.view.destroy(); } } export default Editor; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWVkaXRvci9zcmMvbGliL0VkaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUF1QixNQUFNLG1CQUFtQixDQUFDO0FBQ3JFLE9BQU8sRUFBZSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzRCxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV6QyxPQUFPLGNBQWMsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLGFBQWEsTUFBTSxVQUFVLENBQUM7QUFDckMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN6QyxPQUFPLGlCQUFpQixNQUFNLGtCQUFrQixDQUFDO0FBc0JqRCxNQUFNLGVBQWUsR0FBRztJQUN0QixXQUFXLEVBQUUsSUFBSTtJQUNqQixXQUFXLEVBQUUsSUFBSTtDQUNsQixDQUFDO0FBRUYsTUFBTSxlQUFlLEdBQVk7SUFDL0IsT0FBTyxFQUFFLElBQUk7SUFDYixPQUFPLEVBQUUsSUFBSTtJQUNiLGlCQUFpQixFQUFFLElBQUk7SUFDdkIsVUFBVSxFQUFFLElBQUk7SUFDaEIsTUFBTSxFQUFFLGFBQWE7SUFDckIsT0FBTyxFQUFFLEVBQUU7SUFDWCxTQUFTLEVBQUUsRUFBRTtJQUNiLFVBQVUsRUFBRSxFQUFFO0lBQ2QsUUFBUSxFQUFFLGVBQWU7Q0FDMUIsQ0FBQztBQUVGLE1BQU0sTUFBTTtJQUlWLFlBQVksVUFBbUIsZUFBZTtRQUt0Qyx3QkFBbUIsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO1FBQzdDLGtCQUFhLEdBQUcsSUFBSSxPQUFPLEVBQWMsQ0FBQztRQUxoRCxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsR0FBRyxlQUFlLEVBQUUsR0FBRyxP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LEdBQUcsWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFbEQsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRWxELHFDQUFxQztRQUNyQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2xCLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFO1lBQ2xCLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxjQUFjLENBQUMsTUFBYztRQUMzQixNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUM1QixNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUzQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDdEIsQ0FBQztDQUNGO0FBRUQsZUFBZSxNQUFNLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTY2hlbWEgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XG5pbXBvcnQgeyBFZGl0b3JTdGF0ZSwgUGx1Z2luLCBUcmFuc2FjdGlvbiB9IGZyb20gJ3Byb3NlbWlycm9yLXN0YXRlJztcbmltcG9ydCB7IEVkaXRvclByb3BzLCBFZGl0b3JWaWV3IH0gZnJvbSAncHJvc2VtaXJyb3Itdmlldyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IGlzTmlsIH0gZnJvbSAnbmd4LWVkaXRvci91dGlscyc7XG5cbmltcG9ydCBFZGl0b3JDb21tYW5kcyBmcm9tICcuL0VkaXRvckNvbW1hbmRzJztcbmltcG9ydCBkZWZhdXRsU2NoZW1hIGZyb20gJy4vc2NoZW1hJztcbmltcG9ydCB7IHBhcnNlQ29udGVudCB9IGZyb20gJy4vcGFyc2Vycyc7XG5pbXBvcnQgZ2V0RGVmYXVsdFBsdWdpbnMgZnJvbSAnLi9kZWZhdWx0UGx1Z2lucyc7XG5cbnR5cGUgSlNPTkRvYyA9IFJlY29yZDxzdHJpbmcsIGFueT47XG50eXBlIENvbnRlbnQgPSBzdHJpbmcgfCBudWxsIHwgSlNPTkRvYztcblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICBjb250ZW50PzogQ29udGVudDtcbiAgaGlzdG9yeT86IGJvb2xlYW47XG4gIGtleWJvYXJkU2hvcnRjdXRzPzogYm9vbGVhbjtcbiAgaW5wdXRSdWxlcz86IGJvb2xlYW47XG4gIHNjaGVtYT86IFNjaGVtYTtcbiAgcGx1Z2lucz86IFBsdWdpbltdO1xuICBub2RlVmlld3M/OiBFZGl0b3JQcm9wc1snbm9kZVZpZXdzJ107XG4gIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBmZWF0dXJlcz86IEVkaXRvckZlYXR1cmVzO1xufVxuXG5pbnRlcmZhY2UgRWRpdG9yRmVhdHVyZXMge1xuICBsaW5rT25QYXN0ZT86IGJvb2xlYW47XG4gIHJlc2l6ZUltYWdlPzogYm9vbGVhbjtcbn1cblxuY29uc3QgZGVmYXVsdEZlYXR1cmVzID0ge1xuICBsaW5rT25QYXN0ZTogdHJ1ZSxcbiAgcmVzaXplSW1hZ2U6IHRydWUsXG59O1xuXG5jb25zdCBERUZBVUxUX09QVElPTlM6IE9wdGlvbnMgPSB7XG4gIGNvbnRlbnQ6IG51bGwsXG4gIGhpc3Rvcnk6IHRydWUsXG4gIGtleWJvYXJkU2hvcnRjdXRzOiB0cnVlLFxuICBpbnB1dFJ1bGVzOiB0cnVlLFxuICBzY2hlbWE6IGRlZmF1dGxTY2hlbWEsXG4gIHBsdWdpbnM6IFtdLFxuICBub2RlVmlld3M6IHt9LFxuICBhdHRyaWJ1dGVzOiB7fSxcbiAgZmVhdHVyZXM6IGRlZmF1bHRGZWF0dXJlcyxcbn07XG5cbmNsYXNzIEVkaXRvciB7XG4gIHByaXZhdGUgb3B0aW9uczogT3B0aW9ucztcbiAgdmlldzogRWRpdG9yVmlldztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zID0gREVGQVVMVF9PUFRJT05TKSB7XG4gICAgdGhpcy5vcHRpb25zID0geyAuLi5ERUZBVUxUX09QVElPTlMsIC4uLm9wdGlvbnMgfTtcbiAgICB0aGlzLmNyZWF0ZUVkaXRvcigpO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWx1ZUNoYW5nZXNTdWJqZWN0ID0gbmV3IFN1YmplY3Q8SlNPTkRvYz4oKTtcbiAgcHJpdmF0ZSB1cGRhdGVTdWJqZWN0ID0gbmV3IFN1YmplY3Q8RWRpdG9yVmlldz4oKTtcblxuICBnZXQgdmFsdWVDaGFuZ2VzKCk6IE9ic2VydmFibGU8SlNPTkRvYz4ge1xuICAgIHJldHVybiB0aGlzLnZhbHVlQ2hhbmdlc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXQgdXBkYXRlKCk6IE9ic2VydmFibGU8RWRpdG9yVmlldz4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXQgc2NoZW1hKCk6IFNjaGVtYSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zY2hlbWEgfHwgZGVmYXV0bFNjaGVtYTtcbiAgfVxuXG4gIGdldCBjb21tYW5kcygpOiBFZGl0b3JDb21tYW5kcyB7XG4gICAgcmV0dXJuIG5ldyBFZGl0b3JDb21tYW5kcyh0aGlzLnZpZXcpO1xuICB9XG5cbiAgZ2V0IGZlYXR1cmVzKCk6IEVkaXRvckZlYXR1cmVzIHtcbiAgICByZXR1cm4geyAuLi5kZWZhdWx0RmVhdHVyZXMsIC4uLnRoaXMub3B0aW9ucy5mZWF0dXJlcyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUcmFuc2FjdGlvbnModHI6IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnZpZXcuc3RhdGUuYXBwbHkodHIpO1xuICAgIHRoaXMudmlldy51cGRhdGVTdGF0ZShzdGF0ZSk7XG5cbiAgICB0aGlzLnVwZGF0ZVN1YmplY3QubmV4dCh0aGlzLnZpZXcpO1xuXG4gICAgaWYgKCF0ci5kb2NDaGFuZ2VkICYmICF0ci5nZXRNZXRhKCdGT1JDRV9FTUlUJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBqc29uID0gc3RhdGUuZG9jLnRvSlNPTigpO1xuICAgIHRoaXMudmFsdWVDaGFuZ2VzU3ViamVjdC5uZXh0KGpzb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVFZGl0b3IoKTogdm9pZCB7XG4gICAgY29uc3QgeyBvcHRpb25zLCBzY2hlbWEgfSA9IHRoaXM7XG4gICAgY29uc3QgeyBjb250ZW50ID0gbnVsbCwgbm9kZVZpZXdzIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHsgaGlzdG9yeSA9IHRydWUsIGtleWJvYXJkU2hvcnRjdXRzID0gdHJ1ZSwgaW5wdXRSdWxlcyA9IHRydWUgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBkb2MgPSBwYXJzZUNvbnRlbnQoY29udGVudCwgc2NoZW1hKTtcblxuICAgIGNvbnN0IHBsdWdpbnM6IFBsdWdpbltdID0gb3B0aW9ucy5wbHVnaW5zID8/IFtdO1xuICAgIGNvbnN0IGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSBvcHRpb25zLmF0dHJpYnV0ZXMgPz8ge307XG5cbiAgICBjb25zdCBkZWZhdWx0UGx1Z2lucyA9IGdldERlZmF1bHRQbHVnaW5zKHNjaGVtYSwge1xuICAgICAgaGlzdG9yeSxcbiAgICAgIGtleWJvYXJkU2hvcnRjdXRzLFxuICAgICAgaW5wdXRSdWxlcyxcbiAgICB9KTtcblxuICAgIHRoaXMudmlldyA9IG5ldyBFZGl0b3JWaWV3KG51bGwsIHtcbiAgICAgIHN0YXRlOiBFZGl0b3JTdGF0ZS5jcmVhdGUoe1xuICAgICAgICBkb2MsXG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgcGx1Z2luczogWy4uLmRlZmF1bHRQbHVnaW5zLCAuLi5wbHVnaW5zXSxcbiAgICAgIH0pLFxuICAgICAgbm9kZVZpZXdzLFxuICAgICAgZGlzcGF0Y2hUcmFuc2FjdGlvbjogdGhpcy5oYW5kbGVUcmFuc2FjdGlvbnMuYmluZCh0aGlzKSxcbiAgICAgIGF0dHJpYnV0ZXMsXG4gICAgfSk7XG4gIH1cblxuICBzZXRDb250ZW50KGNvbnRlbnQ6IENvbnRlbnQpOiB2b2lkIHtcbiAgICBpZiAoaXNOaWwoY29udGVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzLnZpZXc7XG4gICAgY29uc3QgeyB0ciwgZG9jIH0gPSBzdGF0ZTtcblxuICAgIGNvbnN0IG5ld0RvYyA9IHBhcnNlQ29udGVudChjb250ZW50LCB0aGlzLnNjaGVtYSk7XG5cbiAgICB0ci5yZXBsYWNlV2l0aCgwLCBzdGF0ZS5kb2MuY29udGVudC5zaXplLCBuZXdEb2MpO1xuXG4gICAgLy8gZG9uJ3QgZW1pdCBpZiBib3RoIGNvbnRlbnQgaXMgc2FtZVxuICAgIGlmIChkb2MuZXEodHIuZG9jKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdHIuZG9jQ2hhbmdlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudmlldy5kaXNwYXRjaCh0cik7XG4gIH1cblxuICByZWdpc3RlclBsdWdpbihwbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXMudmlldztcbiAgICBjb25zdCBwbHVnaW5zID0gWy4uLnN0YXRlLnBsdWdpbnMsIHBsdWdpbl07XG5cbiAgICBjb25zdCBuZXdTdGF0ZSA9IHN0YXRlLnJlY29uZmlndXJlKHsgcGx1Z2lucyB9KTtcbiAgICB0aGlzLnZpZXcudXBkYXRlU3RhdGUobmV3U3RhdGUpO1xuICB9XG5cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXcuZGVzdHJveSgpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEVkaXRvcjtcbiJdfQ==