UNPKG

ngx-editor

Version:

Rich Text Editor for angular using ProseMirror

109 lines 13.5 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, handleScrollToSelection: null, }; 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, handleScrollToSelection: options.handleScrollToSelection, }); } 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWVkaXRvci9zcmMvbGliL0VkaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUF1QixNQUFNLG1CQUFtQixDQUFDO0FBQ3JFLE9BQU8sRUFBZSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzRCxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV6QyxPQUFPLGNBQWMsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLGFBQWEsTUFBTSxVQUFVLENBQUM7QUFDckMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN6QyxPQUFPLGlCQUFpQixNQUFNLGtCQUFrQixDQUFDO0FBdUJqRCxNQUFNLGVBQWUsR0FBRztJQUN0QixXQUFXLEVBQUUsSUFBSTtJQUNqQixXQUFXLEVBQUUsSUFBSTtDQUNsQixDQUFDO0FBRUYsTUFBTSxlQUFlLEdBQVk7SUFDL0IsT0FBTyxFQUFFLElBQUk7SUFDYixPQUFPLEVBQUUsSUFBSTtJQUNiLGlCQUFpQixFQUFFLElBQUk7SUFDdkIsVUFBVSxFQUFFLElBQUk7SUFDaEIsTUFBTSxFQUFFLGFBQWE7SUFDckIsT0FBTyxFQUFFLEVBQUU7SUFDWCxTQUFTLEVBQUUsRUFBRTtJQUNiLFVBQVUsRUFBRSxFQUFFO0lBQ2QsUUFBUSxFQUFFLGVBQWU7SUFDekIsdUJBQXVCLEVBQUUsSUFBSTtDQUM5QixDQUFDO0FBRUYsTUFBTSxNQUFNO0lBSVYsWUFBWSxVQUFtQixlQUFlO1FBS3RDLHdCQUFtQixHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7UUFDN0Msa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBYyxDQUFDO1FBTGhELElBQUksQ0FBQyxPQUFPLEdBQUcsRUFB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QU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDO1FBRTFCLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWxELEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVsRCxxQ0FBcUM7UUFDckMsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNsQixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRTtZQUNsQixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQsY0FBYyxDQUFDLE1BQWM7UUFDM0IsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDNUIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFM0MsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3RCLENBQUM7Q0FDRjtBQUVELGVBQWUsTUFBTSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2NoZW1hIH0gZnJvbSAncHJvc2VtaXJyb3ItbW9kZWwnO1xuaW1wb3J0IHsgRWRpdG9yU3RhdGUsIFBsdWdpbiwgVHJhbnNhY3Rpb24gfSBmcm9tICdwcm9zZW1pcnJvci1zdGF0ZSc7XG5pbXBvcnQgeyBFZGl0b3JQcm9wcywgRWRpdG9yVmlldyB9IGZyb20gJ3Byb3NlbWlycm9yLXZpZXcnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBpc05pbCB9IGZyb20gJ25neC1lZGl0b3IvdXRpbHMnO1xuXG5pbXBvcnQgRWRpdG9yQ29tbWFuZHMgZnJvbSAnLi9FZGl0b3JDb21tYW5kcyc7XG5pbXBvcnQgZGVmYXV0bFNjaGVtYSBmcm9tICcuL3NjaGVtYSc7XG5pbXBvcnQgeyBwYXJzZUNvbnRlbnQgfSBmcm9tICcuL3BhcnNlcnMnO1xuaW1wb3J0IGdldERlZmF1bHRQbHVnaW5zIGZyb20gJy4vZGVmYXVsdFBsdWdpbnMnO1xuXG50eXBlIEpTT05Eb2MgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xudHlwZSBDb250ZW50ID0gc3RyaW5nIHwgbnVsbCB8IEpTT05Eb2M7XG5cbmludGVyZmFjZSBPcHRpb25zIHtcbiAgY29udGVudD86IENvbnRlbnQ7XG4gIGhpc3Rvcnk/OiBib29sZWFuO1xuICBrZXlib2FyZFNob3J0Y3V0cz86IGJvb2xlYW47XG4gIGlucHV0UnVsZXM/OiBib29sZWFuO1xuICBzY2hlbWE/OiBTY2hlbWE7XG4gIHBsdWdpbnM/OiBQbHVnaW5bXTtcbiAgbm9kZVZpZXdzPzogRWRpdG9yUHJvcHNbJ25vZGVWaWV3cyddO1xuICBhdHRyaWJ1dGVzPzogRWRpdG9yUHJvcHNbJ2F0dHJpYnV0ZXMnXTtcbiAgZmVhdHVyZXM/OiBFZGl0b3JGZWF0dXJlcztcbiAgaGFuZGxlU2Nyb2xsVG9TZWxlY3Rpb24/OiBFZGl0b3JQcm9wc1snaGFuZGxlU2Nyb2xsVG9TZWxlY3Rpb24nXTtcbn1cblxuaW50ZXJmYWNlIEVkaXRvckZlYXR1cmVzIHtcbiAgbGlua09uUGFzdGU/OiBib29sZWFuO1xuICByZXNpemVJbWFnZT86IGJvb2xlYW47XG59XG5cbmNvbnN0IGRlZmF1bHRGZWF0dXJlcyA9IHtcbiAgbGlua09uUGFzdGU6IHRydWUsXG4gIHJlc2l6ZUltYWdlOiB0cnVlLFxufTtcblxuY29uc3QgREVGQVVMVF9PUFRJT05TOiBPcHRpb25zID0ge1xuICBjb250ZW50OiBudWxsLFxuICBoaXN0b3J5OiB0cnVlLFxuICBrZXlib2FyZFNob3J0Y3V0czogdHJ1ZSxcbiAgaW5wdXRSdWxlczogdHJ1ZSxcbiAgc2NoZW1hOiBkZWZhdXRsU2NoZW1hLFxuICBwbHVnaW5zOiBbXSxcbiAgbm9kZVZpZXdzOiB7fSxcbiAgYXR0cmlidXRlczoge30sXG4gIGZlYXR1cmVzOiBkZWZhdWx0RmVhdHVyZXMsXG4gIGhhbmRsZVNjcm9sbFRvU2VsZWN0aW9uOiBudWxsLFxufTtcblxuY2xhc3MgRWRpdG9yIHtcbiAgcHJpdmF0ZSBvcHRpb25zOiBPcHRpb25zO1xuICB2aWV3OiBFZGl0b3JWaWV3O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wdGlvbnMgPSBERUZBVUxUX09QVElPTlMpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7IC4uLkRFRkFVTFRfT1BUSU9OUywgLi4ub3B0aW9ucyB9O1xuICAgIHRoaXMuY3JlYXRlRWRpdG9yKCk7XG4gIH1cblxuICBwcml2YXRlIHZhbHVlQ2hhbmdlc1N1YmplY3QgPSBuZXcgU3ViamVjdDxKU09ORG9jPigpO1xuICBwcml2YXRlIHVwZGF0ZVN1YmplY3QgPSBuZXcgU3ViamVjdDxFZGl0b3JWaWV3PigpO1xuXG4gIGdldCB2YWx1ZUNoYW5nZXMoKTogT2JzZXJ2YWJsZTxKU09ORG9jPiB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVDaGFuZ2VzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldCB1cGRhdGUoKTogT2JzZXJ2YWJsZTxFZGl0b3JWaWV3PiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldCBzY2hlbWEoKTogU2NoZW1hIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnNjaGVtYSB8fCBkZWZhdXRsU2NoZW1hO1xuICB9XG5cbiAgZ2V0IGNvbW1hbmRzKCk6IEVkaXRvckNvbW1hbmRzIHtcbiAgICByZXR1cm4gbmV3IEVkaXRvckNvbW1hbmRzKHRoaXMudmlldyk7XG4gIH1cblxuICBnZXQgZmVhdHVyZXMoKTogRWRpdG9yRmVhdHVyZXMge1xuICAgIHJldHVybiB7IC4uLmRlZmF1bHRGZWF0dXJlcywgLi4udGhpcy5vcHRpb25zLmZlYXR1cmVzIH07XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRyYW5zYWN0aW9ucyh0cjogVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMudmlldy5zdGF0ZS5hcHBseSh0cik7XG4gICAgdGhpcy52aWV3LnVwZGF0ZVN0YXRlKHN0YXRlKTtcblxuICAgIHRoaXMudXBkYXRlU3ViamVjdC5uZXh0KHRoaXMudmlldyk7XG5cbiAgICBpZiAoIXRyLmRvY0NoYW5nZWQgJiYgIXRyLmdldE1ldGEoJ0ZPUkNFX0VNSVQnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGpzb24gPSBzdGF0ZS5kb2MudG9KU09OKCk7XG4gICAgdGhpcy52YWx1ZUNoYW5nZXNTdWJqZWN0Lm5leHQoanNvbik7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUVkaXRvcigpOiB2b2lkIHtcbiAgICBjb25zdCB7IG9wdGlvbnMsIHNjaGVtYSB9ID0gdGhpcztcbiAgICBjb25zdCB7IGNvbnRlbnQgPSBudWxsLCBub2RlVmlld3MgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgeyBoaXN0b3J5ID0gdHJ1ZSwga2V5Ym9hcmRTaG9ydGN1dHMgPSB0cnVlLCBpbnB1dFJ1bGVzID0gdHJ1ZSB9ID0gb3B0aW9ucztcblxuICAgIGNvbnN0IGRvYyA9IHBhcnNlQ29udGVudChjb250ZW50LCBzY2hlbWEpO1xuXG4gICAgY29uc3QgcGx1Z2luczogUGx1Z2luW10gPSBvcHRpb25zLnBsdWdpbnMgPz8gW107XG4gICAgY29uc3QgYXR0cmlidXRlczogRWRpdG9yUHJvcHNbJ2F0dHJpYnV0ZXMnXSA9IG9wdGlvbnMuYXR0cmlidXRlcyA/PyB7fTtcblxuICAgIGNvbnN0IGRlZmF1bHRQbHVnaW5zID0gZ2V0RGVmYXVsdFBsdWdpbnMoc2NoZW1hLCB7XG4gICAgICBoaXN0b3J5LFxuICAgICAga2V5Ym9hcmRTaG9ydGN1dHMsXG4gICAgICBpbnB1dFJ1bGVzLFxuICAgIH0pO1xuXG4gICAgdGhpcy52aWV3ID0gbmV3IEVkaXRvclZpZXcobnVsbCwge1xuICAgICAgc3RhdGU6IEVkaXRvclN0YXRlLmNyZWF0ZSh7XG4gICAgICAgIGRvYyxcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICBwbHVnaW5zOiBbLi4uZGVmYXVsdFBsdWdpbnMsIC4uLnBsdWdpbnNdLFxuICAgICAgfSksXG4gICAgICBub2RlVmlld3MsXG4gICAgICBkaXNwYXRjaFRyYW5zYWN0aW9uOiB0aGlzLmhhbmRsZVRyYW5zYWN0aW9ucy5iaW5kKHRoaXMpLFxuICAgICAgYXR0cmlidXRlcyxcbiAgICAgIGhhbmRsZVNjcm9sbFRvU2VsZWN0aW9uOiBvcHRpb25zLmhhbmRsZVNjcm9sbFRvU2VsZWN0aW9uLFxuICAgIH0pO1xuICB9XG5cbiAgc2V0Q29udGVudChjb250ZW50OiBDb250ZW50KTogdm9pZCB7XG4gICAgaWYgKGlzTmlsKGNvbnRlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcy52aWV3O1xuICAgIGNvbnN0IHsgdHIsIGRvYyB9ID0gc3RhdGU7XG5cbiAgICBjb25zdCBuZXdEb2MgPSBwYXJzZUNvbnRlbnQoY29udGVudCwgdGhpcy5zY2hlbWEpO1xuXG4gICAgdHIucmVwbGFjZVdpdGgoMCwgc3RhdGUuZG9jLmNvbnRlbnQuc2l6ZSwgbmV3RG9jKTtcblxuICAgIC8vIGRvbid0IGVtaXQgaWYgYm90aCBjb250ZW50IGlzIHNhbWVcbiAgICBpZiAoZG9jLmVxKHRyLmRvYykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRyLmRvY0NoYW5nZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnZpZXcuZGlzcGF0Y2godHIpO1xuICB9XG5cbiAgcmVnaXN0ZXJQbHVnaW4ocGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzLnZpZXc7XG4gICAgY29uc3QgcGx1Z2lucyA9IFsuLi5zdGF0ZS5wbHVnaW5zLCBwbHVnaW5dO1xuXG4gICAgY29uc3QgbmV3U3RhdGUgPSBzdGF0ZS5yZWNvbmZpZ3VyZSh7IHBsdWdpbnMgfSk7XG4gICAgdGhpcy52aWV3LnVwZGF0ZVN0YXRlKG5ld1N0YXRlKTtcbiAgfVxuXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy52aWV3LmRlc3Ryb3koKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBFZGl0b3I7XG4iXX0=