ngx-editor
Version:
The Rich Text Editor for Angular, Built on ProseMirror
113 lines • 14.3 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,
handleScrollToSelection: null,
linkValidationPattern: '(https?://)?([\\da-z.-]+)\\.([a-z.]{2,6})[/\\w .-]*/??([^#\n\r]*)?#?([^\n\r]*)|(mailto:.*[@].*)',
};
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 linkValidationPattern() {
return this.options.linkValidationPattern;
}
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWVkaXRvci9zcmMvbGliL0VkaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUF1QixNQUFNLG1CQUFtQixDQUFDO0FBQ3JFLE9BQU8sRUFBZSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzRCxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV6QyxPQUFPLGNBQWMsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLGFBQWEsTUFBTSxVQUFVLENBQUM7QUFDckMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN6QyxPQUFPLGlCQUFpQixNQUFNLGtCQUFrQixDQUFDO0FBeUJqRCxNQUFNLGVBQWUsR0FBRztJQUN0QixXQUFXLEVBQUUsSUFBSTtJQUNqQixXQUFXLEVBQUUsSUFBSTtDQUNsQixDQUFDO0FBRUYsTUFBTSxlQUFlLEdBQVk7SUFDL0IsT0FBTyxFQUFFLElBQUk7SUFDYixPQUFPLEVBQUUsSUFBSTtJQUNiLGlCQUFpQixFQUFFLElBQUk7SUFDdkIsVUFBVSxFQUFFLElBQUk7SUFDaEIsTUFBTSxFQUFFLGFBQWE7SUFDckIsT0FBTyxFQUFFLEVBQUU7SUFDWCxTQUFTLEVBQUUsRUFBRTtJQUNiLFVBQVUsRUFBRSxFQUFFO0lBQ2QsUUFBUSxFQUFFLGVBQWU7SUFDekIsdUJBQXVCLEVBQUUsSUFBSTtJQUM3QixxQkFBcUIsRUFBRSxpR0FBaUc7Q0FDekgsQ0FBQztBQUVGLE1BQU0sTUFBTTtJQUlWLFlBQVksVUFBbUIsZUFBZTtRQUt0Qyx3QkFBbUIsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO1FBQzdDLGtCQUFhLEdBQUcsSUFBSSxPQUFPLEVBQWMsQ0FBQztRQUxo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bW9kZWwnO1xuaW1wb3J0IHsgRWRpdG9yU3RhdGUsIFBsdWdpbiwgVHJhbnNhY3Rpb24gfSBmcm9tICdwcm9zZW1pcnJvci1zdGF0ZSc7XG5pbXBvcnQgeyBFZGl0b3JQcm9wcywgRWRpdG9yVmlldyB9IGZyb20gJ3Byb3NlbWlycm9yLXZpZXcnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBpc05pbCB9IGZyb20gJ25neC1lZGl0b3IvdXRpbHMnO1xuXG5pbXBvcnQgRWRpdG9yQ29tbWFuZHMgZnJvbSAnLi9FZGl0b3JDb21tYW5kcyc7XG5pbXBvcnQgZGVmYXV0bFNjaGVtYSBmcm9tICcuL3NjaGVtYSc7XG5pbXBvcnQgeyBwYXJzZUNvbnRlbnQgfSBmcm9tICcuL3BhcnNlcnMnO1xuaW1wb3J0IGdldERlZmF1bHRQbHVnaW5zIGZyb20gJy4vZGVmYXVsdFBsdWdpbnMnO1xuaW1wb3J0IHsgSFRNTCB9IGZyb20gJy4vdHJ1c3RlZFR5cGVzVXRpbCc7XG5cbnR5cGUgSlNPTkRvYyA9IFJlY29yZDxzdHJpbmcsIGFueT47XG50eXBlIENvbnRlbnQgPSBIVE1MIHwgbnVsbCB8IEpTT05Eb2M7XG5cbmludGVyZmFjZSBPcHRpb25zIHtcbiAgY29udGVudD86IENvbnRlbnQ7XG4gIGhpc3Rvcnk/OiBib29sZWFuO1xuICBrZXlib2FyZFNob3J0Y3V0cz86IGJvb2xlYW47XG4gIGlucHV0UnVsZXM/OiBib29sZWFuO1xuICBzY2hlbWE/OiBTY2hlbWE7XG4gIHBsdWdpbnM/OiBQbHVnaW5bXTtcbiAgbm9kZVZpZXdzPzogRWRpdG9yUHJvcHNbJ25vZGVWaWV3cyddO1xuICBhdHRyaWJ1dGVzPzogRWRpdG9yUHJvcHNbJ2F0dHJpYnV0ZXMnXTtcbiAgZmVhdHVyZXM/OiBFZGl0b3JGZWF0dXJlcztcbiAgaGFuZGxlU2Nyb2xsVG9TZWxlY3Rpb24/OiBFZGl0b3JQcm9wc1snaGFuZGxlU2Nyb2xsVG9TZWxlY3Rpb24nXTtcbiAgbGlua1ZhbGlkYXRpb25QYXR0ZXJuPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgRWRpdG9yRmVhdHVyZXMge1xuICBsaW5rT25QYXN0ZT86IGJvb2xlYW47XG4gIHJlc2l6ZUltYWdlPzogYm9vbGVhbjtcbn1cblxuY29uc3QgZGVmYXVsdEZlYXR1cmVzID0ge1xuICBsaW5rT25QYXN0ZTogdHJ1ZSxcbiAgcmVzaXplSW1hZ2U6IHRydWUsXG59O1xuXG5jb25zdCBERUZBVUxUX09QVElPTlM6IE9wdGlvbnMgPSB7XG4gIGNvbnRlbnQ6IG51bGwsXG4gIGhpc3Rvcnk6IHRydWUsXG4gIGtleWJvYXJkU2hvcnRjdXRzOiB0cnVlLFxuICBpbnB1dFJ1bGVzOiB0cnVlLFxuICBzY2hlbWE6IGRlZmF1dGxTY2hlbWEsXG4gIHBsdWdpbnM6IFtdLFxuICBub2RlVmlld3M6IHt9LFxuICBhdHRyaWJ1dGVzOiB7fSxcbiAgZmVhdHVyZXM6IGRlZmF1bHRGZWF0dXJlcyxcbiAgaGFuZGxlU2Nyb2xsVG9TZWxlY3Rpb246IG51bGwsXG4gIGxpbmtWYWxpZGF0aW9uUGF0dGVybjogJyhodHRwcz86Ly8pPyhbXFxcXGRhLXouLV0rKVxcXFwuKFthLXouXXsyLDZ9KVsvXFxcXHcgLi1dKi8/PyhbXiNcXG5cXHJdKik/Iz8oW15cXG5cXHJdKil8KG1haWx0bzouKltAXS4qKScsXG59O1xuXG5jbGFzcyBFZGl0b3Ige1xuICBwcml2YXRlIG9wdGlvbnM6IE9wdGlvbnM7XG4gIHZpZXc6IEVkaXRvclZpZXc7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogT3B0aW9ucyA9IERFRkFVTFRfT1BUSU9OUykge1xuICAgIHRoaXMub3B0aW9ucyA9IHsgLi4uREVGQVVMVF9PUFRJT05TLCAuLi5vcHRpb25zIH07XG4gICAgdGhpcy5jcmVhdGVFZGl0b3IoKTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsdWVDaGFuZ2VzU3ViamVjdCA9IG5ldyBTdWJqZWN0PEpTT05Eb2M+KCk7XG4gIHByaXZhdGUgdXBkYXRlU3ViamVjdCA9IG5ldyBTdWJqZWN0PEVkaXRvclZpZXc+KCk7XG5cbiAgZ2V0IHZhbHVlQ2hhbmdlcygpOiBPYnNlcnZhYmxlPEpTT05Eb2M+IHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZUNoYW5nZXNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0IHVwZGF0ZSgpOiBPYnNlcnZhYmxlPEVkaXRvclZpZXc+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0IHNjaGVtYSgpOiBTY2hlbWEge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc2NoZW1hIHx8IGRlZmF1dGxTY2hlbWE7XG4gIH1cblxuICBnZXQgbGlua1ZhbGlkYXRpb25QYXR0ZXJuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5saW5rVmFsaWRhdGlvblBhdHRlcm47XG4gIH1cblxuICBnZXQgY29tbWFuZHMoKTogRWRpdG9yQ29tbWFuZHMge1xuICAgIHJldHVybiBuZXcgRWRpdG9yQ29tbWFuZHModGhpcy52aWV3KTtcbiAgfVxuXG4gIGdldCBmZWF0dXJlcygpOiBFZGl0b3JGZWF0dXJlcyB7XG4gICAgcmV0dXJuIHsgLi4uZGVmYXVsdEZlYXR1cmVzLCAuLi50aGlzLm9wdGlvbnMuZmVhdHVyZXMgfTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVHJhbnNhY3Rpb25zKHRyOiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy52aWV3LnN0YXRlLmFwcGx5KHRyKTtcbiAgICB0aGlzLnZpZXcudXBkYXRlU3RhdGUoc3RhdGUpO1xuXG4gICAgdGhpcy51cGRhdGVTdWJqZWN0Lm5leHQodGhpcy52aWV3KTtcblxuICAgIGlmICghdHIuZG9jQ2hhbmdlZCAmJiAhdHIuZ2V0TWV0YSgnRk9SQ0VfRU1JVCcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QganNvbiA9IHN0YXRlLmRvYy50b0pTT04oKTtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlc1N1YmplY3QubmV4dChqc29uKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRWRpdG9yKCk6IHZvaWQge1xuICAgIGNvbnN0IHsgb3B0aW9ucywgc2NoZW1hIH0gPSB0aGlzO1xuICAgIGNvbnN0IHsgY29udGVudCA9IG51bGwsIG5vZGVWaWV3cyB9ID0gb3B0aW9ucztcbiAgICBjb25zdCB7IGhpc3RvcnkgPSB0cnVlLCBrZXlib2FyZFNob3J0Y3V0cyA9IHRydWUsIGlucHV0UnVsZXMgPSB0cnVlIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3QgZG9jID0gcGFyc2VDb250ZW50KGNvbnRlbnQsIHNjaGVtYSk7XG5cbiAgICBjb25zdCBwbHVnaW5zOiBQbHVnaW5bXSA9IG9wdGlvbnMucGx1Z2lucyA/PyBbXTtcbiAgICBjb25zdCBhdHRyaWJ1dGVzOiBFZGl0b3JQcm9wc1snYXR0cmlidXRlcyddID0gb3B0aW9ucy5hdHRyaWJ1dGVzID8/IHt9O1xuXG4gICAgY29uc3QgZGVmYXVsdFBsdWdpbnMgPSBnZXREZWZhdWx0UGx1Z2lucyhzY2hlbWEsIHtcbiAgICAgIGhpc3RvcnksXG4gICAgICBrZXlib2FyZFNob3J0Y3V0cyxcbiAgICAgIGlucHV0UnVsZXMsXG4gICAgfSk7XG5cbiAgICB0aGlzLnZpZXcgPSBuZXcgRWRpdG9yVmlldyhudWxsLCB7XG4gICAgICBzdGF0ZTogRWRpdG9yU3RhdGUuY3JlYXRlKHtcbiAgICAgICAgZG9jLFxuICAgICAgICBzY2hlbWEsXG4gICAgICAgIHBsdWdpbnM6IFsuLi5kZWZhdWx0UGx1Z2lucywgLi4ucGx1Z2luc10sXG4gICAgICB9KSxcbiAgICAgIG5vZGVWaWV3cyxcbiAgICAgIGRpc3BhdGNoVHJhbnNhY3Rpb246IHRoaXMuaGFuZGxlVHJhbnNhY3Rpb25zLmJpbmQodGhpcyksXG4gICAgICBhdHRyaWJ1dGVzLFxuICAgICAgaGFuZGxlU2Nyb2xsVG9TZWxlY3Rpb246IG9wdGlvbnMuaGFuZGxlU2Nyb2xsVG9TZWxlY3Rpb24sXG4gICAgfSk7XG4gIH1cblxuICBzZXRDb250ZW50KGNvbnRlbnQ6IENvbnRlbnQpOiB2b2lkIHtcbiAgICBpZiAoaXNOaWwoY29udGVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzLnZpZXc7XG4gICAgY29uc3QgeyB0ciwgZG9jIH0gPSBzdGF0ZTtcblxuICAgIGNvbnN0IG5ld0RvYyA9IHBhcnNlQ29udGVudChjb250ZW50LCB0aGlzLnNjaGVtYSk7XG5cbiAgICB0ci5yZXBsYWNlV2l0aCgwLCBzdGF0ZS5kb2MuY29udGVudC5zaXplLCBuZXdEb2MpO1xuXG4gICAgLy8gZG9uJ3QgZW1pdCBpZiBib3RoIGNvbnRlbnQgaXMgc2FtZVxuICAgIGlmIChkb2MuZXEodHIuZG9jKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdHIuZG9jQ2hhbmdlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudmlldy5kaXNwYXRjaCh0cik7XG4gIH1cblxuICByZWdpc3RlclBsdWdpbihwbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXMudmlldztcbiAgICBjb25zdCBwbHVnaW5zID0gWy4uLnN0YXRlLnBsdWdpbnMsIHBsdWdpbl07XG5cbiAgICBjb25zdCBuZXdTdGF0ZSA9IHN0YXRlLnJlY29uZmlndXJlKHsgcGx1Z2lucyB9KTtcbiAgICB0aGlzLnZpZXcudXBkYXRlU3RhdGUobmV3U3RhdGUpO1xuICB9XG5cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXcuZGVzdHJveSgpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEVkaXRvcjtcbiJdfQ==