ngx-editor
Version:
Rich Text Editor for angular using ProseMirror
107 lines • 13.1 kB
JavaScript
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==