Files
Arbitrate-FrontendH5/node_modules/parchment/src/blot/inline.ts
T

65 lines
1.8 KiB
TypeScript
Raw Normal View History

2024-01-18 10:46:33 +08:00
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;