serialize.ts 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import { TestElement, TestNode, NodeTypes, TestText } from './nodeOps'
  2. export function serialize(
  3. node: TestNode,
  4. indent: number = 0,
  5. depth: number = 0
  6. ): string {
  7. if (node.type === NodeTypes.ELEMENT) {
  8. return serializeElement(node, indent, depth)
  9. } else {
  10. return serializeText(node, indent, depth)
  11. }
  12. }
  13. function serializeElement(
  14. node: TestElement,
  15. indent: number,
  16. depth: number
  17. ): string {
  18. const props = Object.keys(node.props)
  19. .map(key => {
  20. return `${key}=${JSON.stringify(node.props[key])}`
  21. })
  22. .join(' ')
  23. const children = node.children.length
  24. ? (indent ? `\n` : ``) +
  25. node.children.map(c => serialize(c, indent, depth + 1)) +
  26. (indent ? `\n` : ``)
  27. : ``
  28. const padding = indent ? ` `.repeat(indent).repeat(depth) : ``
  29. return (
  30. `${padding}<${node.tag}${props ? ` ${props}` : ``}>` +
  31. `${children}` +
  32. `${padding}</${node.tag}>`
  33. )
  34. }
  35. function serializeText(node: TestText, indent: number, depth: number): string {
  36. const padding = indent ? ` `.repeat(indent).repeat(depth) : ``
  37. return padding + node.text
  38. }