import * as Registry from '../registry';
|
|
export interface AttributorOptions {
|
scope?: Registry.Scope;
|
whitelist?: string[];
|
}
|
|
export default class Attributor {
|
attrName: string;
|
keyName: string;
|
scope: Registry.Scope;
|
whitelist: string[] | undefined;
|
|
static keys(node: HTMLElement): string[] {
|
return [].map.call(node.attributes, function(item: Attr) {
|
return item.name;
|
});
|
}
|
|
constructor(attrName: string, keyName: string, options: AttributorOptions = {}) {
|
this.attrName = attrName;
|
this.keyName = keyName;
|
let attributeBit = Registry.Scope.TYPE & Registry.Scope.ATTRIBUTE;
|
if (options.scope != null) {
|
// Ignore type bits, force attribute bit
|
this.scope = (options.scope & Registry.Scope.LEVEL) | attributeBit;
|
} else {
|
this.scope = Registry.Scope.ATTRIBUTE;
|
}
|
if (options.whitelist != null) this.whitelist = options.whitelist;
|
}
|
|
add(node: HTMLElement, value: string): boolean {
|
if (!this.canAdd(node, value)) return false;
|
node.setAttribute(this.keyName, value);
|
return true;
|
}
|
|
canAdd(node: HTMLElement, value: any): boolean {
|
let match = Registry.query(node, Registry.Scope.BLOT & (this.scope | Registry.Scope.TYPE));
|
if (match == null) return false;
|
if (this.whitelist == null) return true;
|
if (typeof value === 'string') {
|
return this.whitelist.indexOf(value.replace(/["']/g, '')) > -1;
|
} else {
|
return this.whitelist.indexOf(value) > -1;
|
}
|
}
|
|
remove(node: HTMLElement): void {
|
node.removeAttribute(this.keyName);
|
}
|
|
value(node: HTMLElement): string {
|
let value = node.getAttribute(this.keyName);
|
if (this.canAdd(node, value) && value) {
|
return value;
|
}
|
return '';
|
}
|
}
|