136 lines
3.7 KiB
JavaScript
136 lines
3.7 KiB
JavaScript
import { ns } from './elem';
|
|
import { kebabCase } from '../string/format';
|
|
export const CASE_SENSITIVE_ATTR = [
|
|
'viewBox',
|
|
'attributeName',
|
|
'attributeType',
|
|
'repeatCount',
|
|
'textLength',
|
|
'lengthAdjust',
|
|
'gradientUnits',
|
|
];
|
|
export function getAttribute(elem, name) {
|
|
return elem.getAttribute(name);
|
|
}
|
|
export function removeAttribute(elem, name) {
|
|
const qualified = qualifyAttr(name);
|
|
if (qualified.ns) {
|
|
if (elem.hasAttributeNS(qualified.ns, qualified.local)) {
|
|
elem.removeAttributeNS(qualified.ns, qualified.local);
|
|
}
|
|
}
|
|
else if (elem.hasAttribute(name)) {
|
|
elem.removeAttribute(name);
|
|
}
|
|
}
|
|
export function setAttribute(elem, name, value) {
|
|
if (value == null) {
|
|
return removeAttribute(elem, name);
|
|
}
|
|
const qualified = qualifyAttr(name);
|
|
if (qualified.ns && typeof value === 'string') {
|
|
elem.setAttributeNS(qualified.ns, name, value);
|
|
}
|
|
else if (name === 'id') {
|
|
elem.id = `${value}`;
|
|
}
|
|
else {
|
|
elem.setAttribute(name, `${value}`);
|
|
}
|
|
}
|
|
export function setAttributes(elem, attrs) {
|
|
Object.keys(attrs).forEach((name) => {
|
|
setAttribute(elem, name, attrs[name]);
|
|
});
|
|
}
|
|
export function attr(elem, name, value) {
|
|
if (name == null) {
|
|
const attrs = elem.attributes;
|
|
const ret = {};
|
|
for (let i = 0; i < attrs.length; i += 1) {
|
|
ret[attrs[i].name] = attrs[i].value;
|
|
}
|
|
return ret;
|
|
}
|
|
if (typeof name === 'string' && value === undefined) {
|
|
return elem.getAttribute(name);
|
|
}
|
|
if (typeof name === 'object') {
|
|
setAttributes(elem, name);
|
|
}
|
|
else {
|
|
setAttribute(elem, name, value);
|
|
}
|
|
}
|
|
export function qualifyAttr(name) {
|
|
if (name.indexOf(':') !== -1) {
|
|
const combinedKey = name.split(':');
|
|
return {
|
|
ns: ns[combinedKey[0]],
|
|
local: combinedKey[1],
|
|
};
|
|
}
|
|
return {
|
|
ns: null,
|
|
local: name,
|
|
};
|
|
}
|
|
export function kebablizeAttrs(attrs) {
|
|
const result = {};
|
|
Object.keys(attrs).forEach((key) => {
|
|
const name = CASE_SENSITIVE_ATTR.includes(key) ? key : kebabCase(key);
|
|
result[name] = attrs[key];
|
|
});
|
|
return result;
|
|
}
|
|
export function styleToObject(styleString) {
|
|
const ret = {};
|
|
const styles = styleString.split(';');
|
|
styles.forEach((item) => {
|
|
const section = item.trim();
|
|
if (section) {
|
|
const pair = section.split('=');
|
|
if (pair.length) {
|
|
ret[pair[0].trim()] = pair[1] ? pair[1].trim() : '';
|
|
}
|
|
}
|
|
});
|
|
return ret;
|
|
}
|
|
export function mergeAttrs(target, source) {
|
|
Object.keys(source).forEach((attr) => {
|
|
if (attr === 'class') {
|
|
target[attr] = target[attr]
|
|
? `${target[attr]} ${source[attr]}`
|
|
: source[attr];
|
|
}
|
|
else if (attr === 'style') {
|
|
const to = typeof target[attr] === 'object';
|
|
const so = typeof source[attr] === 'object';
|
|
let tt;
|
|
let ss;
|
|
if (to && so) {
|
|
tt = target[attr];
|
|
ss = source[attr];
|
|
}
|
|
else if (to) {
|
|
tt = target[attr];
|
|
ss = styleToObject(source[attr]);
|
|
}
|
|
else if (so) {
|
|
tt = styleToObject(target[attr]);
|
|
ss = source[attr];
|
|
}
|
|
else {
|
|
tt = styleToObject(target[attr]);
|
|
ss = styleToObject(source[attr]);
|
|
}
|
|
target[attr] = mergeAttrs(tt, ss);
|
|
}
|
|
else {
|
|
target[attr] = source[attr];
|
|
}
|
|
});
|
|
return target;
|
|
}
|
|
//# sourceMappingURL=attr.js.map
|