All files / src create-element.js

100% Statements 16/16
75% Branches 6/8
100% Functions 7/7
100% Lines 15/15
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49      726x 729x         27x         753x 753x 753x 1076x                   1803x 1803x 1050x 753x 753x   753x                       753x 753x    
import React from 'react';
 
export function createStyleObject(classNames, elementStyle = {}, stylesheet) {
  return classNames.reduce((styleObject, className) => {
    return {...styleObject, ...stylesheet[className]};
  }, elementStyle);
}
 
export function createClassNameString(classNames) {
  return classNames.join(' ');
}
 
 
export function createChildren(stylesheet, useInlineStyles) {
  let childrenCount = 0;
  return children => {
    childrenCount += 1;
    return children.map((child, i) => createElement({
      node: child,
      stylesheet,
      useInlineStyles,
      key:`code-segment-${childrenCount}-${i}`
    }));
  }
}
 
export default function createElement({ node, stylesheet, style = {}, useInlineStyles, key }) {
  const { properties, type, tagName: TagName, value } = node;
  if (type === 'text') {
    return value;
  } else Eif (TagName) {
    const childrenCreator = createChildren(stylesheet, useInlineStyles);
    const props = (
      useInlineStyles
      ?
      { 
        style: createStyleObject(
          properties.className, 
          Object.assign({}, properties.style, style), 
          stylesheet
        ) 
      }
      :
      { className: createClassNameString(properties.className) }
    );
    const children = childrenCreator(node.children);
    return <TagName key={key} {...props}>{children}</TagName>;
  }
}