UNPKG

ngx-editor

Version:

Rich Text Editor for angular using ProseMirror

108 lines 13.2 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 = Object.assign({}, 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 } = this; const { content = null, nodeViews } = options; const { history = true, keyboardShortcuts = true, inputRules = true } = options; const schema = this.schema; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWVkaXRvci9zcmMvbGliL0VkaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUF1QixNQUFNLG1CQUFtQixDQUFDO0FBQ3JFLE9BQU8sRUFBZSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzRCxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV6QyxPQUFPLGNBQWMsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLGFBQWEsTUFBTSxVQUFVLENBQUM7QUFDckMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN6QyxPQUFPLGlCQUFpQixNQUFNLGtCQUFrQixDQUFDO0FBc0JqRCxNQUFNLGVBQWUsR0FBRztJQUN0QixXQUFXLEVBQUUsSUFBSTtJQUNqQixXQUFXLEVBQUUsSUFBSTtDQUNsQixDQUFBO0FBRUQsTUFBTSxlQUFlLEdBQVk7SUFDL0IsT0FBTyxFQUFFLElBQUk7SUFDYixPQUFPLEVBQUUsSUFBSTtJQUNiLGlCQUFpQixFQUFFLElBQUk7SUFDdkIsVUFBVSxFQUFFLElBQUk7SUFDaEIsTUFBTSxFQUFFLGFBQWE7SUFDckIsT0FBTyxFQUFFLEVBQUU7SUFDWCxTQUFTLEVBQUUsRUFBRTtJQUNiLFVBQVUsRUFBRSxFQUFFO0lBQ2QsUUFBUSxFQUFFLGVBQWU7Q0FDMUIsQ0FBQztBQUVGLE1BQU0sTUFBTTtJQUlWLFlBQVksVUFBbUIsZUFBZTtRQUt0Qyx3QkFBbUIsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO1FBQzdDLGtCQUFhLEdBQUcsSUFBSSxPQUFPLEVBQWMsQ0FBQztRQUxoRCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxF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LEVBQUUsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDO1FBRTFCLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWxELEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVsRCxxQ0FBcUM7UUFDckMsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNsQixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRTtZQUNsQixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQsY0FBYyxDQUFDLE1BQWM7UUFDM0IsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDNUIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFM0MsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3RCLENBQUM7Q0FDRjtBQUVELGVBQWUsTUFBTSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2NoZW1hIH0gZnJvbSAncHJvc2VtaXJyb3ItbW9kZWwnO1xuaW1wb3J0IHsgRWRpdG9yU3RhdGUsIFBsdWdpbiwgVHJhbnNhY3Rpb24gfSBmcm9tICdwcm9zZW1pcnJvci1zdGF0ZSc7XG5pbXBvcnQgeyBFZGl0b3JQcm9wcywgRWRpdG9yVmlldyB9IGZyb20gJ3Byb3NlbWlycm9yLXZpZXcnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBpc05pbCB9IGZyb20gJ25neC1lZGl0b3IvdXRpbHMnO1xuXG5pbXBvcnQgRWRpdG9yQ29tbWFuZHMgZnJvbSAnLi9FZGl0b3JDb21tYW5kcyc7XG5pbXBvcnQgZGVmYXV0bFNjaGVtYSBmcm9tICcuL3NjaGVtYSc7XG5pbXBvcnQgeyBwYXJzZUNvbnRlbnQgfSBmcm9tICcuL3BhcnNlcnMnO1xuaW1wb3J0IGdldERlZmF1bHRQbHVnaW5zIGZyb20gJy4vZGVmYXVsdFBsdWdpbnMnO1xuXG50eXBlIEpTT05Eb2MgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xudHlwZSBDb250ZW50ID0gc3RyaW5nIHwgbnVsbCB8IEpTT05Eb2M7XG5cbmludGVyZmFjZSBPcHRpb25zIHtcbiAgY29udGVudD86IENvbnRlbnQ7XG4gIGhpc3Rvcnk/OiBib29sZWFuO1xuICBrZXlib2FyZFNob3J0Y3V0cz86IGJvb2xlYW47XG4gIGlucHV0UnVsZXM/OiBib29sZWFuO1xuICBzY2hlbWE/OiBTY2hlbWE7XG4gIHBsdWdpbnM/OiBQbHVnaW5bXTtcbiAgbm9kZVZpZXdzPzogRWRpdG9yUHJvcHNbJ25vZGVWaWV3cyddO1xuICBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgZmVhdHVyZXM/OiBFZGl0b3JGZWF0dXJlc1xufVxuXG5pbnRlcmZhY2UgRWRpdG9yRmVhdHVyZXMge1xuICBsaW5rT25QYXN0ZT86IGJvb2xlYW47XG4gIHJlc2l6ZUltYWdlPzogYm9vbGVhbjtcbn1cblxuY29uc3QgZGVmYXVsdEZlYXR1cmVzID0ge1xuICBsaW5rT25QYXN0ZTogdHJ1ZSxcbiAgcmVzaXplSW1hZ2U6IHRydWVcbn1cblxuY29uc3QgREVGQVVMVF9PUFRJT05TOiBPcHRpb25zID0ge1xuICBjb250ZW50OiBudWxsLFxuICBoaXN0b3J5OiB0cnVlLFxuICBrZXlib2FyZFNob3J0Y3V0czogdHJ1ZSxcbiAgaW5wdXRSdWxlczogdHJ1ZSxcbiAgc2NoZW1hOiBkZWZhdXRsU2NoZW1hLFxuICBwbHVnaW5zOiBbXSxcbiAgbm9kZVZpZXdzOiB7fSxcbiAgYXR0cmlidXRlczoge30sXG4gIGZlYXR1cmVzOiBkZWZhdWx0RmVhdHVyZXNcbn07XG5cbmNsYXNzIEVkaXRvciB7XG4gIHByaXZhdGUgb3B0aW9uczogT3B0aW9ucztcbiAgdmlldzogRWRpdG9yVmlldztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zID0gREVGQVVMVF9PUFRJT05TKSB7XG4gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9PUFRJT05TLCBvcHRpb25zKTtcbiAgICB0aGlzLmNyZWF0ZUVkaXRvcigpO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWx1ZUNoYW5nZXNTdWJqZWN0ID0gbmV3IFN1YmplY3Q8SlNPTkRvYz4oKTtcbiAgcHJpdmF0ZSB1cGRhdGVTdWJqZWN0ID0gbmV3IFN1YmplY3Q8RWRpdG9yVmlldz4oKTtcblxuICBnZXQgdmFsdWVDaGFuZ2VzKCk6IE9ic2VydmFibGU8SlNPTkRvYz4ge1xuICAgIHJldHVybiB0aGlzLnZhbHVlQ2hhbmdlc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXQgdXBkYXRlKCk6IE9ic2VydmFibGU8RWRpdG9yVmlldz4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXQgc2NoZW1hKCk6IFNjaGVtYSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zY2hlbWEgfHwgZGVmYXV0bFNjaGVtYTtcbiAgfVxuXG4gIGdldCBjb21tYW5kcygpOiBFZGl0b3JDb21tYW5kcyB7XG4gICAgcmV0dXJuIG5ldyBFZGl0b3JDb21tYW5kcyh0aGlzLnZpZXcpO1xuICB9XG5cbiAgZ2V0IGZlYXR1cmVzKCk6IEVkaXRvckZlYXR1cmVzIHtcbiAgICByZXR1cm4geyAuLi5kZWZhdWx0RmVhdHVyZXMsIC4uLnRoaXMub3B0aW9ucy5mZWF0dXJlcyB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRyYW5zYWN0aW9ucyh0cjogVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMudmlldy5zdGF0ZS5hcHBseSh0cik7XG4gICAgdGhpcy52aWV3LnVwZGF0ZVN0YXRlKHN0YXRlKTtcblxuICAgIHRoaXMudXBkYXRlU3ViamVjdC5uZXh0KHRoaXMudmlldyk7XG5cbiAgICBpZiAoIXRyLmRvY0NoYW5nZWQgJiYgIXRyLmdldE1ldGEoJ0ZPUkNFX0VNSVQnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGpzb24gPSBzdGF0ZS5kb2MudG9KU09OKCk7XG4gICAgdGhpcy52YWx1ZUNoYW5nZXNTdWJqZWN0Lm5leHQoanNvbik7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUVkaXRvcigpOiB2b2lkIHtcbiAgICBjb25zdCB7IG9wdGlvbnMgfSA9IHRoaXM7XG4gICAgY29uc3QgeyBjb250ZW50ID0gbnVsbCwgbm9kZVZpZXdzIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHsgaGlzdG9yeSA9IHRydWUsIGtleWJvYXJkU2hvcnRjdXRzID0gdHJ1ZSwgaW5wdXRSdWxlcyA9IHRydWUgfSA9IG9wdGlvbnM7XG4gICAgY29uc3Qgc2NoZW1hID0gdGhpcy5zY2hlbWE7XG5cbiAgICBjb25zdCBkb2MgPSBwYXJzZUNvbnRlbnQoY29udGVudCwgc2NoZW1hKTtcblxuICAgIGNvbnN0IHBsdWdpbnM6IFBsdWdpbltdID0gb3B0aW9ucy5wbHVnaW5zID8/IFtdO1xuICAgIGNvbnN0IGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSBvcHRpb25zLmF0dHJpYnV0ZXMgPz8ge307XG5cbiAgICBjb25zdCBkZWZhdWx0UGx1Z2lucyA9IGdldERlZmF1bHRQbHVnaW5zKHNjaGVtYSwge1xuICAgICAgaGlzdG9yeSxcbiAgICAgIGtleWJvYXJkU2hvcnRjdXRzLFxuICAgICAgaW5wdXRSdWxlc1xuICAgIH0pO1xuXG4gICAgdGhpcy52aWV3ID0gbmV3IEVkaXRvclZpZXcobnVsbCwge1xuICAgICAgc3RhdGU6IEVkaXRvclN0YXRlLmNyZWF0ZSh7XG4gICAgICAgIGRvYyxcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICBwbHVnaW5zOiBbLi4uZGVmYXVsdFBsdWdpbnMsIC4uLnBsdWdpbnNdLFxuICAgICAgfSksXG4gICAgICBub2RlVmlld3MsXG4gICAgICBkaXNwYXRjaFRyYW5zYWN0aW9uOiB0aGlzLmhhbmRsZVRyYW5zYWN0aW9ucy5iaW5kKHRoaXMpLFxuICAgICAgYXR0cmlidXRlc1xuICAgIH0pO1xuICB9XG5cbiAgc2V0Q29udGVudChjb250ZW50OiBDb250ZW50KTogdm9pZCB7XG4gICAgaWYgKGlzTmlsKGNvbnRlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcy52aWV3O1xuICAgIGNvbnN0IHsgdHIsIGRvYyB9ID0gc3RhdGU7XG5cbiAgICBjb25zdCBuZXdEb2MgPSBwYXJzZUNvbnRlbnQoY29udGVudCwgdGhpcy5zY2hlbWEpO1xuXG4gICAgdHIucmVwbGFjZVdpdGgoMCwgc3RhdGUuZG9jLmNvbnRlbnQuc2l6ZSwgbmV3RG9jKTtcblxuICAgIC8vIGRvbid0IGVtaXQgaWYgYm90aCBjb250ZW50IGlzIHNhbWVcbiAgICBpZiAoZG9jLmVxKHRyLmRvYykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRyLmRvY0NoYW5nZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnZpZXcuZGlzcGF0Y2godHIpO1xuICB9XG5cbiAgcmVnaXN0ZXJQbHVnaW4ocGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzLnZpZXc7XG4gICAgY29uc3QgcGx1Z2lucyA9IFsuLi5zdGF0ZS5wbHVnaW5zLCBwbHVnaW5dO1xuXG4gICAgY29uc3QgbmV3U3RhdGUgPSBzdGF0ZS5yZWNvbmZpZ3VyZSh7IHBsdWdpbnMgfSk7XG4gICAgdGhpcy52aWV3LnVwZGF0ZVN0YXRlKG5ld1N0YXRlKTtcbiAgfVxuXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy52aWV3LmRlc3Ryb3koKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBFZGl0b3I7XG4iXX0=