html-elements.ts 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. // elements which should contain only block elements
  2. const blockContainingElements = new Set([
  3. 'DL',
  4. 'FIELDSET',
  5. 'FIGURE',
  6. 'HEAD',
  7. 'OL',
  8. 'TABLE',
  9. 'TBODY',
  10. 'TFOOT',
  11. 'THEAD',
  12. 'TR',
  13. 'UL',
  14. ])
  15. export const isBlockContainingElement = (node: Node): node is HTMLElement =>
  16. blockContainingElements.has(node.nodeName)
  17. // elements which are block elements (as opposed to inline elements)
  18. const blockElements = new Set([
  19. 'ADDRESS',
  20. 'ARTICLE',
  21. 'ASIDE',
  22. 'BLOCKQUOTE',
  23. 'BODY',
  24. 'CANVAS',
  25. 'DD',
  26. 'DIV',
  27. 'DL',
  28. 'DT',
  29. 'FIELDSET',
  30. 'FIGCAPTION',
  31. 'FIGURE',
  32. 'FOOTER',
  33. 'FORM',
  34. 'H1',
  35. 'H2',
  36. 'H3',
  37. 'H4',
  38. 'H5',
  39. 'H6',
  40. 'HEADER',
  41. 'HGROUP',
  42. 'HR',
  43. 'LI',
  44. 'MAIN',
  45. 'NAV',
  46. 'NOSCRIPT',
  47. 'OL',
  48. 'P',
  49. 'PRE',
  50. 'SECTION',
  51. 'TABLE',
  52. 'TBODY',
  53. 'TD',
  54. 'TFOOT',
  55. 'TH',
  56. 'THEAD',
  57. 'TR',
  58. 'UL',
  59. 'VIDEO',
  60. ])
  61. export const isBlockElement = (node: Node): node is HTMLElement =>
  62. blockElements.has(node.nodeName)
  63. const inlineElements = new Set([
  64. 'A',
  65. 'ABBR',
  66. 'ACRONYM',
  67. 'B',
  68. 'BIG',
  69. 'CITE',
  70. 'DEL',
  71. 'EM',
  72. 'I',
  73. 'INS',
  74. 'SMALL',
  75. 'SPAN',
  76. 'STRONG',
  77. 'SUB',
  78. 'SUP',
  79. 'TEXTAREA', // TODO
  80. 'TIME',
  81. 'TT',
  82. ])
  83. export const isInlineElement = (node: Node): node is HTMLElement =>
  84. inlineElements.has(node.nodeName)
  85. const codeElements = new Set(['CODE', 'PRE'])
  86. export const isCodeElement = (node: Node): node is HTMLElement =>
  87. codeElements.has(node.nodeName)
  88. const keepEmptyBlockElements = new Set(['TD', 'TH', 'CANVAS', 'DT', 'DD', 'HR'])
  89. export const shouldRemoveEmptyBlockElement = (
  90. node: Node
  91. ): node is HTMLElement =>
  92. !keepEmptyBlockElements.has(node.nodeName) && !node.hasChildNodes()
  93. export const isTextNode = (node: Node): node is Text =>
  94. node.nodeType === Node.TEXT_NODE
  95. export const isElementNode = (node: Node): node is HTMLElement =>
  96. node.nodeType === Node.ELEMENT_NODE