Files
NapCatQQ/.pnpm-store/v3/files/ae/a644a2db7852b5fd0af8728ceeccc97c77516e102186380bfeeac5a297ca5eeee99cdfb070d20bd183d95ec12423abc08596e12e74d5221ae8ed5774b2786e
T
TanTan e311ca3275
Build NapCat Artifacts / Type Check & Test (push) Waiting to run
docs: 仓库链接指向本镜像仓库
2026-11-13 09:25:58 +08:00

80 lines
2.2 KiB
Plaintext

import type { Formattable } from '../blot/abstract/blot.js';
import Registry from '../registry.js';
import Scope from '../scope.js';
import Attributor from './attributor.js';
import ClassAttributor from './class.js';
import StyleAttributor from './style.js';
class AttributorStore {
private attributes: { [key: string]: Attributor } = {};
private domNode: HTMLElement;
constructor(domNode: HTMLElement) {
this.domNode = domNode;
this.build();
}
public attribute(attribute: Attributor, value: any): void {
// verb
if (value) {
if (attribute.add(this.domNode, value)) {
if (attribute.value(this.domNode) != null) {
this.attributes[attribute.attrName] = attribute;
} else {
delete this.attributes[attribute.attrName];
}
}
} else {
attribute.remove(this.domNode);
delete this.attributes[attribute.attrName];
}
}
public build(): void {
this.attributes = {};
const blot = Registry.find(this.domNode);
if (blot == null) {
return;
}
const attributes = Attributor.keys(this.domNode);
const classes = ClassAttributor.keys(this.domNode);
const styles = StyleAttributor.keys(this.domNode);
attributes
.concat(classes)
.concat(styles)
.forEach((name) => {
const attr = blot.scroll.query(name, Scope.ATTRIBUTE);
if (attr instanceof Attributor) {
this.attributes[attr.attrName] = attr;
}
});
}
public copy(target: Formattable): void {
Object.keys(this.attributes).forEach((key) => {
const value = this.attributes[key].value(this.domNode);
target.format(key, value);
});
}
public move(target: Formattable): void {
this.copy(target);
Object.keys(this.attributes).forEach((key) => {
this.attributes[key].remove(this.domNode);
});
this.attributes = {};
}
public values(): { [key: string]: any } {
return Object.keys(this.attributes).reduce(
(attributes: { [key: string]: any }, name: string) => {
attributes[name] = this.attributes[name].value(this.domNode);
return attributes;
},
{},
);
}
}
export default AttributorStore;