serialize.ts 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import {
  2. TestElement,
  3. TestNode,
  4. NodeTypes,
  5. TestText,
  6. TestComment
  7. } from './nodeOps'
  8. import { isOn } from '@vue/shared'
  9. export function serialize(
  10. node: TestNode,
  11. indent: number = 0,
  12. depth: number = 0
  13. ): string {
  14. if (node.type === NodeTypes.ELEMENT) {
  15. return serializeElement(node, indent, depth)
  16. } else {
  17. return serializeText(node, indent, depth)
  18. }
  19. }
  20. export function serializeInner(
  21. node: TestElement,
  22. indent: number = 0,
  23. depth: number = 0
  24. ) {
  25. const newLine = indent ? `\n` : ``
  26. return node.children.length
  27. ? newLine +
  28. node.children.map(c => serialize(c, indent, depth + 1)).join(newLine) +
  29. newLine
  30. : ``
  31. }
  32. function serializeElement(
  33. node: TestElement,
  34. indent: number,
  35. depth: number
  36. ): string {
  37. const props = Object.keys(node.props)
  38. .map(key => {
  39. const value = node.props[key]
  40. return isOn(key) || value == null
  41. ? ``
  42. : value === ``
  43. ? key
  44. : `${key}=${JSON.stringify(value)}`
  45. })
  46. .filter(Boolean)
  47. .join(' ')
  48. const padding = indent ? ` `.repeat(indent).repeat(depth) : ``
  49. return (
  50. `${padding}<${node.tag}${props ? ` ${props}` : ``}>` +
  51. `${serializeInner(node, indent, depth)}` +
  52. `${padding}</${node.tag}>`
  53. )
  54. }
  55. function serializeText(
  56. node: TestText | TestComment,
  57. indent: number,
  58. depth: number
  59. ): string {
  60. const padding = indent ? ` `.repeat(indent).repeat(depth) : ``
  61. return (
  62. padding +
  63. (node.type === NodeTypes.COMMENT ? `<!--${node.text}-->` : node.text)
  64. )
  65. }