| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- import FormatBlot from './abstract/format';
- import LeafBlot from './abstract/leaf';
- import ShadowBlot from './abstract/shadow';
- import * as Registry from '../registry';
- // Shallow object comparison
- function isEqual(obj1: Object, obj2: Object): boolean {
- if (Object.keys(obj1).length !== Object.keys(obj2).length) return false;
- // @ts-ignore
- for (let prop in obj1) {
- // @ts-ignore
- if (obj1[prop] !== obj2[prop]) return false;
- }
- return true;
- }
- class InlineBlot extends FormatBlot {
- static blotName = 'inline';
- static scope = Registry.Scope.INLINE_BLOT;
- static tagName = 'SPAN';
- static formats(domNode: HTMLElement): any {
- if (domNode.tagName === InlineBlot.tagName) return undefined;
- return super.formats(domNode);
- }
- format(name: string, value: any) {
- if (name === this.statics.blotName && !value) {
- this.children.forEach(child => {
- if (!(child instanceof FormatBlot)) {
- child = child.wrap(InlineBlot.blotName, true);
- }
- this.attributes.copy(<FormatBlot>child);
- });
- this.unwrap();
- } else {
- super.format(name, value);
- }
- }
- formatAt(index: number, length: number, name: string, value: any): void {
- if (this.formats()[name] != null || Registry.query(name, Registry.Scope.ATTRIBUTE)) {
- let blot = <InlineBlot>this.isolate(index, length);
- blot.format(name, value);
- } else {
- super.formatAt(index, length, name, value);
- }
- }
- optimize(context: { [key: string]: any }): void {
- super.optimize(context);
- let formats = this.formats();
- if (Object.keys(formats).length === 0) {
- return this.unwrap(); // unformatted span
- }
- let next = this.next;
- if (next instanceof InlineBlot && next.prev === this && isEqual(formats, next.formats())) {
- next.moveChildren(this);
- next.remove();
- }
- }
- }
- export default InlineBlot;
|