123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- import standards from '../../standards';
- import matchesFn from '../../commons/matches';
- /**
- * Return the spec for an HTML element from the standards object. Since the spec is determined by the node and what attributes it has, a node is required.
- * @param {VirtualNode} vNode The VirtualNode to get the spec for.
- * @return {Object} The standard spec object
- */
- function getElementSpec(vNode) {
- const standard = standards.htmlElms[vNode.props.nodeName];
- // invalid element name (could be an svg or custom element name)
- if (!standard) {
- return {};
- }
- if (!standard.variant) {
- return standard;
- }
- // start with the information at the top level
- const { variant, ...spec } = standard;
- // loop through all variants (excluding default) finding anything
- // that matches
- for (const variantName in variant) {
- if (!variant.hasOwnProperty(variantName) || variantName === 'default') {
- continue;
- }
- const { matches, ...props } = variant[variantName];
- if (matchesFn(vNode, matches)) {
- for (const propName in props) {
- if (props.hasOwnProperty(propName)) {
- spec[propName] = props[propName];
- }
- }
- }
- }
- // apply defaults if properties were not found
- for (const propName in variant.default) {
- if (
- variant.default.hasOwnProperty(propName) &&
- typeof spec[propName] === 'undefined'
- ) {
- spec[propName] = variant.default[propName];
- }
- }
- return spec;
- }
- export default getElementSpec;
|