formatElements.js 1.1 KB

1234567891011121314151617181920212223242526272829
  1. import React, { cloneElement, Fragment } from 'react';
  2. var tagRe = /<(\w+)>(.*?)<\/\1>|<(\w+)\/>/;
  3. var nlRe = /(?:\r\n|\r|\n)/g;
  4. function getElements(parts) {
  5. if (!parts.length)
  6. return [];
  7. var _a = parts.slice(0, 4), paired = _a[0], children = _a[1], unpaired = _a[2], after = _a[3];
  8. return [
  9. [(paired || unpaired), children || '', after],
  10. ].concat(getElements(parts.slice(4, parts.length)));
  11. }
  12. export default function formatElements(value, elements) {
  13. if (elements === void 0) { elements = []; }
  14. var parts = value.replace(nlRe, '').split(tagRe);
  15. if (parts.length === 1)
  16. return value;
  17. var tree = [];
  18. var before = parts.shift();
  19. if (before)
  20. tree.push(before);
  21. getElements(parts).forEach(function (_a, realIndex) {
  22. var key = _a[0], children = _a[1], after = _a[2];
  23. var element = elements[key] || React.createElement(Fragment, null);
  24. tree.push(cloneElement(element, { key: realIndex }, children ? formatElements(children, elements) : element.props.children));
  25. if (after)
  26. tree.push(after);
  27. });
  28. return tree;
  29. }