'use strict';
exports.__esModule = true;
exports.ensureNodeData = ensureNodeData;
exports.getNodeType = getNodeType;
exports.removeNode = removeNode;
exports.setAccessor = setAccessor;
exports.getRawNodeAttributes = getRawNodeAttributes;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _constants = require('../constants');
var _options = require('../options');
var _options2 = _interopRequireDefault(_options);
var _util = require('../util');
function ensureNodeData(node, data) {
return node[_constants.ATTR_KEY] || (node[_constants.ATTR_KEY] = data || {});
}
function getNodeType(node) {
if (node instanceof Text) return 3;
Eif (node instanceof Element) return 1;
return 0;
}
/** Removes a given DOM Node from its parent. */
function removeNode(node) {
var p = node.parentNode;
if (p) p.removeChild(node);
}
/** Set a named attribute on the given Node, with special behavior for some names and event handlers.
* If `value` is `null`, the attribute/handler will be removed.
* @param {Element} node An element to mutate
* @param {string} name The name/key to set, such as an event or attribute name
* @param {any} value An attribute value, such as a function to be used as an event handler
* @param {any} previousValue The last value that was set for this name/node pair
* @private
*/
function setAccessor(node, name, value, old, isSvg) {
ensureNodeData(node)[name] = value;
if (name === 'key' || name === 'children') return;
if (name === 'class' && !isSvg) {
node.className = value || '';
} else if (name === 'style') {
if (!value || _util.isString(value) || _util.isString(old)) {
node.style.cssText = value || '';
}
if (value && typeof value === 'object') {
if (!_util.isString(old)) {
for (var i in old) {
if (!(i in value)) node.style[i] = '';
}
}
for (var i in value) {
node.style[i] = typeof value[i] === 'number' && !_constants.NON_DIMENSION_PROPS[i] ? value[i] + 'px' : value[i];
}
}
} else if (name === 'dangerouslySetInnerHTML') {
if (value) node.innerHTML = value.__html;
} else if (name[0] === 'o' && name[1] === 'n') {
var l = node._listeners || (node._listeners = {});
name = _util.toLowerCase(name.substring(2));
if (value) {
if (!l[name]) node.addEventListener(name, eventProxy);
} else if (l[name]) {
node.removeEventListener(name, eventProxy);
}
l[name] = value;
} else if (name !== 'type' && !isSvg && name in node) {
setProperty(node, name, _util.empty(value) ? '' : value);
if (_util.falsey(value)) node.removeAttribute(name);
} else {
var ns = isSvg && name.match(/^xlink\:?(.+)/);
if (_util.falsey(value)) {
Iif (ns) node.removeAttributeNS('http://www.w3.org/1999/xlink', _util.toLowerCase(ns[1]));else node.removeAttribute(name);
} else if (typeof value !== 'object' && !_util.isFunction(value)) {
Iif (ns) node.setAttributeNS('http://www.w3.org/1999/xlink', _util.toLowerCase(ns[1]), value);else node.setAttribute(name, value);
}
}
}
/** Attempt to set a DOM property to the given value.
* IE & FF throw for certain property-value combinations.
*/
function setProperty(node, name, value) {
try {
node[name] = value;
} catch (e) {}
}
/** Proxy an event to hooked event handlers
* @private
*/
function eventProxy(e) {
return this._listeners[e.type](_options2['default'].event && _options2['default'].event(e) || e);
}
/** Get a node's attributes as a hashmap.
* @private
*/
function getRawNodeAttributes(node) {
var attrs = {};
for (var i = node.attributes.length; i--;) {
attrs[node.attributes[i].name] = node.attributes[i].value;
}
return attrs;
}
|