parametric-svg/js

View on GitHub
source/utils/get-parameters.js

Summary

Maintainability
A
1 hr
Test Coverage
import "babel/polyfill";
import asObject from "as/object";
import evalExpression from "eval-expression";

import validateParameter from "./validate-parameter";
import warn from "./warn";

import
  { PARAMETRIC_NAMESPACE, PARAMETRIC_NAMESPACE_PREFIX
  , SVG_NAMESPACE, SVG_NAMESPACE_PREFIX
  } from "../settings";

function namespaceParameters (svgRoot, namespace, prefix=null) {
  let textContent;
  // Get `<ref>` elements belonging to the `namespace`,
  let elements = Array.from(svgRoot.getElementsByTagNameNS
    ( namespace
    , "ref"
    ));

  // …or fall back to `<prefix:ref>` (no namespace support in HTML5).
  if (!elements.length && prefix) elements
    = Array.from(svgRoot.getElementsByTagName(prefix + ":ref"))
    ;

  // Map the keys and values to an object and return.
  return asObject(elements.map(element => {
    let value, error, validated;
    let key = element.getAttribute("param");
    let rawValue =
      (  element.getAttribute("default")
      || (textContent = element.firstChild) && textContent.nodeValue
      || "null"
      );

    try {
      validated = validateParameter(evalExpression(rawValue));
      }
    catch (e) {error = e;}
    if (!error) {
      value = validated.value;
      error = validated.error;
      }
    if (error) warn
      ( "Error while parsing default parameter.\n"
      + "Element:", element, "\n"
      + "Error:", error
      );

    return (
      { key
      , value: {error, value}
      });
    }));
  }


export default function getParameters (svgRoot) {
  return Object.assign({}
    , namespaceParameters(svgRoot, SVG_NAMESPACE, SVG_NAMESPACE_PREFIX)
    , namespaceParameters(svgRoot, PARAMETRIC_NAMESPACE, PARAMETRIC_NAMESPACE_PREFIX)
    );
  }