/** * Split a delimited component property string (e.g., `material.color`) to an object * containing `component` name and `property` name. If there is no delimiter, just return the * string back. * * Cache arrays from splitting strings via delimiter to save on memory. * * @param {string} str - e.g., `material.opacity`. * @param {string} delimiter - e.g., `.`. * @returns {array} e.g., `['material', 'opacity']`. */ var propertyPathCache = {}; function getComponentPropertyPath (str, delimiter) { delimiter = delimiter || '.'; if (!propertyPathCache[delimiter]) { propertyPathCache[delimiter] = {}; } if (str.indexOf(delimiter) !== -1) { propertyPathCache[delimiter][str] = str.split(delimiter); } else { propertyPathCache[delimiter][str] = str; } return propertyPathCache[delimiter][str]; } module.exports.getComponentPropertyPath = getComponentPropertyPath; module.exports.propertyPathCache = propertyPathCache; /** * Get component property using encoded component name + component property name with a * delimiter. */ module.exports.getComponentProperty = function (el, name, delimiter) { var splitName; delimiter = delimiter || '.'; if (name.indexOf(delimiter) !== -1) { splitName = getComponentPropertyPath(name, delimiter); if (splitName.constructor === String) { return el.getAttribute(splitName); } return el.getAttribute(splitName[0])[splitName[1]]; } return el.getAttribute(name); }; /** * Set component property using encoded component name + component property name with a * delimiter. */ module.exports.setComponentProperty = function (el, name, value, delimiter) { var splitName; delimiter = delimiter || '.'; if (name.indexOf(delimiter) !== -1) { splitName = getComponentPropertyPath(name, delimiter); if (splitName.constructor === String) { el.setAttribute(splitName, value); } else { el.setAttribute(splitName[0], splitName[1], value); } return; } el.setAttribute(name, value); };