@aquera/nile-elements 1.9.7 → 1.9.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/README.md +6 -0
  2. package/dist/{index-249de90a.esm.js → index-289706c7.esm.js} +1 -1
  3. package/dist/{index-df196058.cjs.js → index-d7e6f1c6.cjs.js} +2 -2
  4. package/dist/index-d7e6f1c6.cjs.js.map +1 -0
  5. package/dist/index.cjs.js +1 -1
  6. package/dist/index.esm.js +1 -1
  7. package/dist/index.js +1587 -1276
  8. package/dist/katex-44476ab4.esm.js +1 -0
  9. package/dist/katex-f4186f87.cjs.js +2 -0
  10. package/dist/katex-f4186f87.cjs.js.map +1 -0
  11. package/dist/nile-color-picker/index.cjs.js +1 -1
  12. package/dist/nile-color-picker/index.esm.js +1 -1
  13. package/dist/nile-color-picker/nile-color-picker.cjs.js +1 -1
  14. package/dist/nile-color-picker/nile-color-picker.cjs.js.map +1 -1
  15. package/dist/nile-color-picker/nile-color-picker.esm.js +1 -1
  16. package/dist/nile-select/virtual-scroll-helper.cjs.js +1 -1
  17. package/dist/nile-select/virtual-scroll-helper.cjs.js.map +1 -1
  18. package/dist/nile-select/virtual-scroll-helper.esm.js +52 -44
  19. package/dist/nile-virtual-select/renderer.cjs.js +1 -1
  20. package/dist/nile-virtual-select/renderer.cjs.js.map +1 -1
  21. package/dist/nile-virtual-select/renderer.esm.js +23 -22
  22. package/dist/nile-wysiwyg-editor/engine/commands.cjs.js +1 -1
  23. package/dist/nile-wysiwyg-editor/engine/commands.cjs.js.map +1 -1
  24. package/dist/nile-wysiwyg-editor/engine/commands.esm.js +1 -1
  25. package/dist/nile-wysiwyg-editor/engine/create-state.cjs.js +1 -1
  26. package/dist/nile-wysiwyg-editor/engine/create-state.cjs.js.map +1 -1
  27. package/dist/nile-wysiwyg-editor/engine/create-state.esm.js +1 -1
  28. package/dist/nile-wysiwyg-editor/engine/index.cjs.js +1 -1
  29. package/dist/nile-wysiwyg-editor/engine/index.esm.js +1 -1
  30. package/dist/nile-wysiwyg-editor/engine/inputrules.cjs.js +1 -1
  31. package/dist/nile-wysiwyg-editor/engine/keymap.cjs.js +1 -1
  32. package/dist/nile-wysiwyg-editor/engine/keymap.esm.js +1 -1
  33. package/dist/nile-wysiwyg-editor/engine/plugins/code-highlight.cjs.js +1 -1
  34. package/dist/nile-wysiwyg-editor/engine/plugins/code-highlight.cjs.js.map +1 -1
  35. package/dist/nile-wysiwyg-editor/engine/plugins/code-highlight.esm.js +1 -1
  36. package/dist/nile-wysiwyg-editor/engine/plugins/embed-view.cjs.js +1 -1
  37. package/dist/nile-wysiwyg-editor/engine/plugins/embed-view.cjs.js.map +1 -1
  38. package/dist/nile-wysiwyg-editor/engine/plugins/embed-view.esm.js +1 -1
  39. package/dist/nile-wysiwyg-editor/engine/plugins/embeds.cjs.js +1 -1
  40. package/dist/nile-wysiwyg-editor/engine/plugins/embeds.cjs.js.map +1 -1
  41. package/dist/nile-wysiwyg-editor/engine/plugins/embeds.esm.js +1 -1
  42. package/dist/nile-wysiwyg-editor/engine/plugins/math-view.cjs.js +1 -1
  43. package/dist/nile-wysiwyg-editor/engine/plugins/math-view.cjs.js.map +1 -1
  44. package/dist/nile-wysiwyg-editor/engine/plugins/math-view.esm.js +1 -1
  45. package/dist/nile-wysiwyg-editor/engine/plugins/style-block-view.cjs.js +2 -0
  46. package/dist/nile-wysiwyg-editor/engine/plugins/style-block-view.cjs.js.map +1 -0
  47. package/dist/nile-wysiwyg-editor/engine/plugins/style-block-view.esm.js +1 -0
  48. package/dist/nile-wysiwyg-editor/engine/plugins/tables.cjs.js +1 -1
  49. package/dist/nile-wysiwyg-editor/engine/plugins/tables.cjs.js.map +1 -1
  50. package/dist/nile-wysiwyg-editor/engine/plugins/tables.esm.js +1 -1
  51. package/dist/nile-wysiwyg-editor/engine/sanitize.cjs.js +1 -1
  52. package/dist/nile-wysiwyg-editor/engine/sanitize.cjs.js.map +1 -1
  53. package/dist/nile-wysiwyg-editor/engine/sanitize.esm.js +1 -1
  54. package/dist/nile-wysiwyg-editor/engine/schema.cjs.js +1 -1
  55. package/dist/nile-wysiwyg-editor/engine/schema.cjs.js.map +1 -1
  56. package/dist/nile-wysiwyg-editor/engine/schema.esm.js +1 -1
  57. package/dist/nile-wysiwyg-editor/engine/selection-state.cjs.js +1 -1
  58. package/dist/nile-wysiwyg-editor/engine/selection-state.cjs.js.map +1 -1
  59. package/dist/nile-wysiwyg-editor/engine/selection-state.esm.js +1 -1
  60. package/dist/nile-wysiwyg-editor/index.cjs.js +1 -1
  61. package/dist/nile-wysiwyg-editor/index.esm.js +1 -1
  62. package/dist/nile-wysiwyg-editor/math/katex-renderer.cjs.js +2 -0
  63. package/dist/nile-wysiwyg-editor/math/katex-renderer.cjs.js.map +1 -0
  64. package/dist/nile-wysiwyg-editor/math/katex-renderer.esm.js +1 -0
  65. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.cjs.js +1 -1
  66. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.cjs.js.map +1 -1
  67. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.css.cjs.js +1 -1
  68. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.css.cjs.js.map +1 -1
  69. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.css.esm.js +22 -3
  70. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.esm.js +7 -6
  71. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.cjs.js +1 -1
  72. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.esm.js +1 -1
  73. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar-item.cjs.js +2 -0
  74. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar-item.cjs.js.map +1 -0
  75. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar-item.esm.js +1 -0
  76. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.cjs.js +1 -1
  77. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.cjs.js.map +1 -1
  78. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.cjs.js +1 -1
  79. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.cjs.js.map +1 -1
  80. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.esm.js +33 -54
  81. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.esm.js +83 -95
  82. package/dist/nile-wysiwyg-editor/types.cjs.js +1 -1
  83. package/dist/nile-wysiwyg-editor/types.cjs.js.map +1 -1
  84. package/dist/nile-wysiwyg-editor/types.esm.js +1 -1
  85. package/dist/nile-wysiwyg-editor/ui/bubble-item.cjs.js +2 -0
  86. package/dist/nile-wysiwyg-editor/ui/bubble-item.cjs.js.map +1 -0
  87. package/dist/nile-wysiwyg-editor/ui/bubble-item.esm.js +1 -0
  88. package/dist/nile-wysiwyg-editor/ui/bubble-menu.cjs.js +1 -1
  89. package/dist/nile-wysiwyg-editor/ui/bubble-menu.cjs.js.map +1 -1
  90. package/dist/nile-wysiwyg-editor/ui/bubble-menu.esm.js +23 -15
  91. package/dist/nile-wysiwyg-editor/ui/code-block-menu.cjs.js +1 -1
  92. package/dist/nile-wysiwyg-editor/ui/code-block-menu.cjs.js.map +1 -1
  93. package/dist/nile-wysiwyg-editor/ui/code-block-menu.esm.js +3 -3
  94. package/dist/nile-wysiwyg-editor/ui/embed-panel.cjs.js +1 -1
  95. package/dist/nile-wysiwyg-editor/ui/embed-panel.cjs.js.map +1 -1
  96. package/dist/nile-wysiwyg-editor/ui/embed-panel.esm.js +2 -2
  97. package/dist/nile-wysiwyg-editor/ui/math-panel.cjs.js +1 -1
  98. package/dist/nile-wysiwyg-editor/ui/math-panel.cjs.js.map +1 -1
  99. package/dist/nile-wysiwyg-editor/ui/math-panel.esm.js +0 -3
  100. package/dist/nile-wysiwyg-editor/ui/preview.cjs.js +2 -0
  101. package/dist/nile-wysiwyg-editor/ui/preview.cjs.js.map +1 -0
  102. package/dist/nile-wysiwyg-editor/ui/preview.esm.js +8 -0
  103. package/dist/nile-wysiwyg-editor/ui/source-view.cjs.js +1 -1
  104. package/dist/nile-wysiwyg-editor/ui/source-view.cjs.js.map +1 -1
  105. package/dist/nile-wysiwyg-editor/ui/source-view.esm.js +225 -24
  106. package/dist/nile-wysiwyg-editor/ui/suggest-list.cjs.js +1 -1
  107. package/dist/nile-wysiwyg-editor/ui/suggest-list.cjs.js.map +1 -1
  108. package/dist/nile-wysiwyg-editor/ui/suggest-list.esm.js +9 -9
  109. package/dist/nile-wysiwyg-editor/ui/table-grid-picker.cjs.js +1 -1
  110. package/dist/nile-wysiwyg-editor/ui/table-grid-picker.cjs.js.map +1 -1
  111. package/dist/nile-wysiwyg-editor/ui/table-grid-picker.esm.js +115 -13
  112. package/dist/nile-wysiwyg-editor/ui/table-menu.cjs.js +1 -1
  113. package/dist/nile-wysiwyg-editor/ui/table-menu.cjs.js.map +1 -1
  114. package/dist/nile-wysiwyg-editor/ui/table-menu.esm.js +13 -12
  115. package/dist/src/index.d.ts +5 -0
  116. package/dist/src/index.js +3 -0
  117. package/dist/src/index.js.map +1 -1
  118. package/dist/src/nile-color-picker/nile-color-picker.d.ts +1 -0
  119. package/dist/src/nile-color-picker/nile-color-picker.js +1 -0
  120. package/dist/src/nile-color-picker/nile-color-picker.js.map +1 -1
  121. package/dist/src/nile-select/virtual-scroll-helper.js +9 -1
  122. package/dist/src/nile-select/virtual-scroll-helper.js.map +1 -1
  123. package/dist/src/nile-virtual-select/renderer.js +1 -0
  124. package/dist/src/nile-virtual-select/renderer.js.map +1 -1
  125. package/dist/src/nile-wysiwyg-editor/engine/index.d.ts +1 -0
  126. package/dist/src/nile-wysiwyg-editor/engine/index.js +1 -0
  127. package/dist/src/nile-wysiwyg-editor/engine/index.js.map +1 -1
  128. package/dist/src/nile-wysiwyg-editor/engine/plugins/embed-view.js +3 -0
  129. package/dist/src/nile-wysiwyg-editor/engine/plugins/embed-view.js.map +1 -1
  130. package/dist/src/nile-wysiwyg-editor/engine/plugins/embeds.d.ts +19 -4
  131. package/dist/src/nile-wysiwyg-editor/engine/plugins/embeds.js +23 -18
  132. package/dist/src/nile-wysiwyg-editor/engine/plugins/embeds.js.map +1 -1
  133. package/dist/src/nile-wysiwyg-editor/engine/plugins/math-view.d.ts +8 -3
  134. package/dist/src/nile-wysiwyg-editor/engine/plugins/math-view.js +41 -4
  135. package/dist/src/nile-wysiwyg-editor/engine/plugins/math-view.js.map +1 -1
  136. package/dist/src/nile-wysiwyg-editor/engine/plugins/style-block-view.d.ts +17 -0
  137. package/dist/src/nile-wysiwyg-editor/engine/plugins/style-block-view.js +174 -0
  138. package/dist/src/nile-wysiwyg-editor/engine/plugins/style-block-view.js.map +1 -0
  139. package/dist/src/nile-wysiwyg-editor/engine/plugins/tables.js +33 -2
  140. package/dist/src/nile-wysiwyg-editor/engine/plugins/tables.js.map +1 -1
  141. package/dist/src/nile-wysiwyg-editor/engine/pm.test.js +49 -8
  142. package/dist/src/nile-wysiwyg-editor/engine/pm.test.js.map +1 -1
  143. package/dist/src/nile-wysiwyg-editor/engine/sanitize.d.ts +12 -0
  144. package/dist/src/nile-wysiwyg-editor/engine/sanitize.js +76 -8
  145. package/dist/src/nile-wysiwyg-editor/engine/sanitize.js.map +1 -1
  146. package/dist/src/nile-wysiwyg-editor/engine/schema.d.ts +2 -0
  147. package/dist/src/nile-wysiwyg-editor/engine/schema.js +154 -2
  148. package/dist/src/nile-wysiwyg-editor/engine/schema.js.map +1 -1
  149. package/dist/src/nile-wysiwyg-editor/index.d.ts +5 -0
  150. package/dist/src/nile-wysiwyg-editor/index.js +3 -0
  151. package/dist/src/nile-wysiwyg-editor/index.js.map +1 -1
  152. package/dist/src/nile-wysiwyg-editor/math/katex-renderer.d.ts +38 -0
  153. package/dist/src/nile-wysiwyg-editor/math/katex-renderer.js +40 -0
  154. package/dist/src/nile-wysiwyg-editor/math/katex-renderer.js.map +1 -0
  155. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.css.js +22 -3
  156. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.css.js.map +1 -1
  157. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.d.ts +36 -0
  158. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.js +125 -8
  159. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.js.map +1 -1
  160. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.test.js +5 -2
  161. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.test.js.map +1 -1
  162. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.d.ts +2 -0
  163. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.js +1 -0
  164. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.js.map +1 -1
  165. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar-item.d.ts +55 -0
  166. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar-item.js +79 -0
  167. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar-item.js.map +1 -0
  168. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.js +33 -54
  169. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.js.map +1 -1
  170. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.d.ts +50 -2
  171. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.js +158 -102
  172. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.js.map +1 -1
  173. package/dist/src/nile-wysiwyg-editor/types.d.ts +4 -2
  174. package/dist/src/nile-wysiwyg-editor/types.js +2 -2
  175. package/dist/src/nile-wysiwyg-editor/types.js.map +1 -1
  176. package/dist/src/nile-wysiwyg-editor/ui/bubble-item.d.ts +48 -0
  177. package/dist/src/nile-wysiwyg-editor/ui/bubble-item.js +69 -0
  178. package/dist/src/nile-wysiwyg-editor/ui/bubble-item.js.map +1 -0
  179. package/dist/src/nile-wysiwyg-editor/ui/bubble-menu.d.ts +17 -2
  180. package/dist/src/nile-wysiwyg-editor/ui/bubble-menu.js +128 -35
  181. package/dist/src/nile-wysiwyg-editor/ui/bubble-menu.js.map +1 -1
  182. package/dist/src/nile-wysiwyg-editor/ui/embed-panel.d.ts +2 -1
  183. package/dist/src/nile-wysiwyg-editor/ui/embed-panel.js +4 -3
  184. package/dist/src/nile-wysiwyg-editor/ui/embed-panel.js.map +1 -1
  185. package/dist/src/nile-wysiwyg-editor/ui/math-panel.js +0 -3
  186. package/dist/src/nile-wysiwyg-editor/ui/math-panel.js.map +1 -1
  187. package/dist/src/nile-wysiwyg-editor/ui/preview.d.ts +20 -0
  188. package/dist/src/nile-wysiwyg-editor/ui/preview.js +44 -0
  189. package/dist/src/nile-wysiwyg-editor/ui/preview.js.map +1 -0
  190. package/dist/src/nile-wysiwyg-editor/ui/source-view.d.ts +35 -3
  191. package/dist/src/nile-wysiwyg-editor/ui/source-view.js +337 -24
  192. package/dist/src/nile-wysiwyg-editor/ui/source-view.js.map +1 -1
  193. package/dist/src/nile-wysiwyg-editor/ui/suggest-list.d.ts +1 -0
  194. package/dist/src/nile-wysiwyg-editor/ui/suggest-list.js +9 -0
  195. package/dist/src/nile-wysiwyg-editor/ui/suggest-list.js.map +1 -1
  196. package/dist/src/nile-wysiwyg-editor/ui/table-grid-picker.d.ts +13 -2
  197. package/dist/src/nile-wysiwyg-editor/ui/table-grid-picker.js +166 -10
  198. package/dist/src/nile-wysiwyg-editor/ui/table-grid-picker.js.map +1 -1
  199. package/dist/src/nile-wysiwyg-editor/ui/table-menu.d.ts +1 -0
  200. package/dist/src/nile-wysiwyg-editor/ui/table-menu.js +10 -8
  201. package/dist/src/nile-wysiwyg-editor/ui/table-menu.js.map +1 -1
  202. package/dist/src/version.js +1 -1
  203. package/dist/src/version.js.map +1 -1
  204. package/dist/tsconfig.tsbuildinfo +1 -1
  205. package/dist/xml-25c4108a.esm.js +1 -0
  206. package/dist/xml-90fd974e.cjs.js +2 -0
  207. package/dist/xml-90fd974e.cjs.js.map +1 -0
  208. package/package.json +2 -1
  209. package/rollup.config.js +1 -0
  210. package/src/index.ts +8 -0
  211. package/src/nile-color-picker/nile-color-picker.ts +1 -0
  212. package/src/nile-select/virtual-scroll-helper.ts +9 -1
  213. package/src/nile-virtual-select/renderer.ts +1 -1
  214. package/src/nile-wysiwyg-editor/engine/index.ts +1 -0
  215. package/src/nile-wysiwyg-editor/engine/plugins/embed-view.ts +3 -0
  216. package/src/nile-wysiwyg-editor/engine/plugins/embeds.ts +26 -20
  217. package/src/nile-wysiwyg-editor/engine/plugins/math-view.ts +45 -4
  218. package/src/nile-wysiwyg-editor/engine/plugins/style-block-view.ts +178 -0
  219. package/src/nile-wysiwyg-editor/engine/plugins/tables.ts +34 -2
  220. package/src/nile-wysiwyg-editor/engine/pm.test.ts +58 -8
  221. package/src/nile-wysiwyg-editor/engine/sanitize.ts +71 -8
  222. package/src/nile-wysiwyg-editor/engine/schema.ts +158 -7
  223. package/src/nile-wysiwyg-editor/index.ts +5 -0
  224. package/src/nile-wysiwyg-editor/math/katex-renderer.ts +59 -0
  225. package/src/nile-wysiwyg-editor/math/katex.d.ts +17 -0
  226. package/src/nile-wysiwyg-editor/nile-wysiwyg-editor.css.ts +22 -3
  227. package/src/nile-wysiwyg-editor/nile-wysiwyg-editor.test.ts +5 -2
  228. package/src/nile-wysiwyg-editor/nile-wysiwyg-editor.ts +142 -7
  229. package/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.ts +2 -0
  230. package/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar-item.ts +68 -0
  231. package/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.ts +33 -54
  232. package/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.ts +202 -108
  233. package/src/nile-wysiwyg-editor/types.ts +6 -4
  234. package/src/nile-wysiwyg-editor/ui/bubble-item.ts +60 -0
  235. package/src/nile-wysiwyg-editor/ui/bubble-menu.ts +147 -40
  236. package/src/nile-wysiwyg-editor/ui/embed-panel.ts +4 -3
  237. package/src/nile-wysiwyg-editor/ui/math-panel.ts +0 -3
  238. package/src/nile-wysiwyg-editor/ui/preview.ts +42 -0
  239. package/src/nile-wysiwyg-editor/ui/source-view.ts +339 -31
  240. package/src/nile-wysiwyg-editor/ui/suggest-list.ts +10 -0
  241. package/src/nile-wysiwyg-editor/ui/table-grid-picker.ts +160 -10
  242. package/src/nile-wysiwyg-editor/ui/table-menu.ts +10 -8
  243. package/vscode-html-custom-data.json +75 -6
  244. package/dist/index-df196058.cjs.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"pm.test.js","sourceRoot":"","sources":["../../../../src/nile-wysiwyg-editor/engine/pm.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from '@open-wc/testing';\nimport { TextSelection, NodeSelection, AllSelection } from 'prosemirror-state';\nimport {\n defaultSchema,\n htmlToDoc,\n htmlToSlice,\n docToHtml,\n isOfficeHtml,\n cleanOfficeHtml,\n docToMarkdown,\n sanitizeHtml,\n createEditorState,\n getCommand,\n computeToolbarState,\n isDocEmpty,\n countWords,\n getFindState,\n searchTr,\n findStepTr,\n replaceActiveTr,\n replaceAllTr,\n plainTextSlice,\n stripSliceFormatting,\n} from './index';\nimport type { SuggestionMatch } from './plugins/suggestions';\nimport { toEmbedUrl, isAllowedEmbedSrc } from './plugins/embeds';\nimport { codeHighlightKey } from './plugins/code-highlight';\n\n/** Builds an editor state with the whole document selected. */\nfunction stateWithAllSelected(html: string) {\n const doc = htmlToDoc(defaultSchema, html);\n const state = createEditorState({ doc });\n const selection = TextSelection.create(state.doc, 1, state.doc.content.size - 1);\n return state.apply(state.tr.setSelection(selection));\n}\n\ndescribe('sanitizeHtml', () => {\n it('removes script elements entirely', () => {\n expect(sanitizeHtml('<p>hi</p><script>alert(1)</script>')).to.equal('<p>hi</p>');\n });\n\n it('removes inline event handlers', () => {\n const out = sanitizeHtml('<p onclick=\"alert(1)\" onmouseover=\"x()\">hi</p>');\n expect(out).to.not.include('onclick').and.to.not.include('onmouseover');\n });\n\n it('drops javascript: URLs', () => {\n const out = sanitizeHtml('<a href=\"javascript:alert(1)\">x</a>');\n expect(out).to.not.include('javascript:');\n });\n\n it('keeps safe links and forces noopener on _blank', () => {\n const out = sanitizeHtml('<a href=\"https://example.com\" target=\"_blank\">x</a>');\n expect(out).to.include('https://example.com');\n expect(out).to.include('noopener');\n });\n\n it('filters style declarations to the allowed set', () => {\n const out = sanitizeHtml(\n '<span style=\"color: red; position: fixed; background-image: url(x)\">x</span>'\n );\n expect(out).to.include('color: red');\n expect(out).to.not.include('position');\n expect(out).to.not.include('url(');\n });\n\n it('unwraps unknown elements but keeps their content', () => {\n expect(sanitizeHtml('<article><p>kept</p></article>')).to.equal('<p>kept</p>');\n });\n\n it('drops iframes, styles and forms with content', () => {\n const out = sanitizeHtml(\n '<iframe src=\"x\"></iframe><style>p{}</style><form><input></form><p>ok</p>'\n );\n expect(out).to.equal('<p>ok</p>');\n });\n});\n\ndescribe('serializer round-trip', () => {\n const cases = [\n '<p>plain text</p>',\n '<h2>heading</h2><p>body</p>',\n '<p><strong>bold</strong> and <em>italic</em> and <u>underlined</u></p>',\n '<ul><li><p>one</p></li><li><p>two</p></li></ul>',\n '<ol><li><p>first</p></li></ol>',\n '<blockquote><p>quoted</p></blockquote>',\n '<p><a href=\"https://example.com\">link</a></p>',\n '<p style=\"text-align: center\">centered</p>',\n '<p><span style=\"color: rgb(255, 0, 0)\">red</span></p>',\n '<p>line<br>break</p>',\n '<hr>',\n ];\n\n for (const html of cases) {\n it(`round-trips ${html.slice(0, 40)}`, () => {\n const doc = htmlToDoc(defaultSchema, html);\n const out = docToHtml(doc);\n const reparsed = htmlToDoc(defaultSchema, out);\n expect(reparsed.eq(doc), `stable parse for ${html}`).to.equal(true);\n });\n }\n\n it('parses Word-style font-weight styles as bold', () => {\n const doc = htmlToDoc(defaultSchema, '<p><span style=\"font-weight: 700\">x</span></p>');\n expect(docToHtml(doc)).to.include('<strong>');\n });\n\n it('detects empty documents', () => {\n expect(isDocEmpty(htmlToDoc(defaultSchema, ''))).to.equal(true);\n expect(isDocEmpty(htmlToDoc(defaultSchema, '<p></p>'))).to.equal(true);\n expect(isDocEmpty(htmlToDoc(defaultSchema, '<p>x</p>'))).to.equal(false);\n });\n});\n\ndescribe('commands', () => {\n it('toggles bold over a selection', () => {\n let state = stateWithAllSelected('<p>hello</p>');\n const bold = getCommand(state, 'bold')!;\n bold(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p><strong>hello</strong></p>');\n });\n\n it('sets and clears headings', () => {\n let state = stateWithAllSelected('<p>title</p>');\n getCommand(state, 'heading', { level: 2 })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<h2>title</h2>');\n getCommand(state, 'paragraph')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p>title</p>');\n });\n\n it('wraps and lifts bullet lists', () => {\n let state = stateWithAllSelected('<p>item</p>');\n getCommand(state, 'bulletList')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('<ul>');\n getCommand(state, 'bulletList')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p>item</p>');\n });\n\n it('converts between list types in place', () => {\n let state = stateWithAllSelected('<ul><li><p>item</p></li></ul>');\n getCommand(state, 'orderedList')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('<ol>');\n expect(docToHtml(state.doc)).to.not.include('<ul>');\n });\n\n it('sets alignment on textblocks', () => {\n let state = stateWithAllSelected('<p>text</p>');\n getCommand(state, 'align', { align: 'right' })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('text-align: right');\n });\n\n it('applies and removes links', () => {\n let state = stateWithAllSelected('<p>click</p>');\n getCommand(state, 'link', { href: 'https://example.com' })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('href=\"https://example.com\"');\n getCommand(state, 'unlink')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p>click</p>');\n });\n\n it('applies text color and clears formatting', () => {\n let state = stateWithAllSelected('<p>color</p>');\n getCommand(state, 'textColor', { color: '#ff0000' })!(state, tr => {\n state = state.apply(tr);\n });\n // Browsers normalize hex colors to rgb() in style attributes.\n expect(docToHtml(state.doc)).to.match(/color: (#ff0000|rgb\\(255, 0, 0\\))/);\n getCommand(state, 'clearFormatting')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p>color</p>');\n });\n});\n\ndescribe('phase 2: rich content', () => {\n it('round-trips tables', () => {\n const html =\n '<table><tbody><tr><th><p>h1</p></th><th><p>h2</p></th></tr>' +\n '<tr><td><p>a</p></td><td><p>b</p></td></tr></tbody></table>';\n const doc = htmlToDoc(defaultSchema, html);\n const out = docToHtml(doc);\n expect(out).to.include('<table');\n expect(out).to.include('<th');\n expect(htmlToDoc(defaultSchema, out).eq(doc)).to.equal(true);\n });\n\n it('keeps colspan/rowspan through sanitization', () => {\n const out = sanitizeHtml('<table><tr><td colspan=\"2\" rowspan=\"3\">x</td></tr></table>');\n expect(out).to.include('colspan=\"2\"');\n expect(out).to.include('rowspan=\"3\"');\n });\n\n it('round-trips inline images', () => {\n const html = '<p>look: <img src=\"https://x.dev/a.png\" alt=\"A\"></p>';\n const doc = htmlToDoc(defaultSchema, html);\n const out = docToHtml(doc);\n expect(out).to.include('src=\"https://x.dev/a.png\"');\n expect(out).to.include('alt=\"A\"');\n expect(htmlToDoc(defaultSchema, out).eq(doc)).to.equal(true);\n });\n\n it('parses bare pasted images', () => {\n const doc = htmlToDoc(defaultSchema, '<p>before</p><img src=\"https://x.dev/a.png\">');\n expect(docToHtml(doc)).to.include('<img src=\"https://x.dev/a.png\"');\n });\n\n it('drops images with unsafe URLs but allows raster data URLs', () => {\n expect(sanitizeHtml('<img src=\"javascript:alert(1)\">')).to.not.include('src');\n expect(\n sanitizeHtml('<img src=\"data:image/png;base64,iVBORw0KGgo=\">')\n ).to.include('data:image/png');\n expect(\n sanitizeHtml('<img src=\"data:image/svg+xml,<svg onload=alert(1)>\">')\n ).to.not.include('svg');\n });\n\n it('round-trips code blocks preserving whitespace', () => {\n const doc = htmlToDoc(\n defaultSchema,\n '<pre data-language=\"js\"><code>const a = 1;\\n indent();</code></pre>'\n );\n const out = docToHtml(doc);\n expect(out).to.include('data-language=\"js\"');\n expect(out).to.include('const a = 1;\\n indent();');\n });\n\n it('toggles code blocks via the codeBlock command', () => {\n let state = stateWithAllSelected('<p>snippet</p>');\n getCommand(state, 'codeBlock')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('<pre');\n getCommand(state, 'codeBlock')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p>snippet</p>');\n });\n\n it('inserts tables and edits rows/columns', () => {\n let state = stateWithAllSelected('<p></p>');\n getCommand(state, 'insertTable', { rows: 2, cols: 2 })!(state, tr => {\n state = state.apply(tr);\n });\n let table = state.doc.firstChild!;\n expect(table.type.name).to.equal('table');\n expect(table.childCount).to.equal(2);\n\n // Put the cursor inside the first cell, then add a row.\n const inside = TextSelection.near(state.doc.resolve(4));\n state = state.apply(state.tr.setSelection(inside));\n getCommand(state, 'addRowAfter')!(state, tr => {\n state = state.apply(tr);\n });\n table = state.doc.firstChild!;\n expect(table.childCount).to.equal(3);\n\n getCommand(state, 'deleteTable')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.not.include('<table');\n });\n\n it('inserts inline images via the insertImage command', () => {\n let state = stateWithAllSelected('<p></p>');\n getCommand(state, 'insertImage', { src: 'https://x.dev/i.png', alt: 'pic' })!(\n state,\n tr => {\n state = state.apply(tr);\n }\n );\n const out = docToHtml(state.doc);\n expect(out).to.include('<img');\n expect(out).to.include('alt=\"pic\"');\n });\n\n it('reports inTable and inCodeBlock in toolbar state', () => {\n let state = stateWithAllSelected('<p></p>');\n getCommand(state, 'insertTable', { rows: 2, cols: 2 })!(state, tr => {\n state = state.apply(tr);\n });\n state = state.apply(state.tr.setSelection(TextSelection.near(state.doc.resolve(4))));\n expect(computeToolbarState(state).inTable).to.equal(true);\n\n const codeState = stateWithAllSelected('<pre><code>x</code></pre>');\n expect(computeToolbarState(codeState).inCodeBlock).to.equal(true);\n });\n});\n\ndescribe('phase 3: productivity', () => {\n it('round-trips mention nodes', () => {\n const html =\n '<p>ping <span data-mention-trigger=\"@\" data-mention-key=\"u1\" data-mention-label=\"Ada\">@Ada</span> now</p>';\n const doc = htmlToDoc(defaultSchema, html);\n const out = docToHtml(doc);\n expect(out).to.include('data-mention-key=\"u1\"');\n expect(out).to.include('data-mention-label=\"Ada\"');\n expect(out).to.include('@Ada');\n expect(htmlToDoc(defaultSchema, out).eq(doc)).to.equal(true);\n });\n\n it('keeps mention data attributes through sanitization', () => {\n const out = sanitizeHtml(\n '<span data-mention-key=\"u1\" data-mention-trigger=\"@\" data-mention-label=\"Ada\" onclick=\"x()\">@Ada</span>'\n );\n expect(out).to.include('data-mention-key=\"u1\"');\n expect(out).to.not.include('onclick');\n });\n\n it('tracks trigger queries through the suggestion plugin', () => {\n const seen: SuggestionMatch[] = [];\n let state = createEditorState({\n doc: htmlToDoc(defaultSchema, '<p></p>'),\n mentions: {\n getTriggers: () => ['@'],\n onChange: match => seen.push(match),\n },\n });\n state = state.apply(state.tr.insertText('hello @ad', 1));\n const last = seen[seen.length - 1];\n expect(last.active).to.equal(true);\n expect(last.trigger).to.equal('@');\n expect(last.query).to.equal('ad');\n\n // A space ends the suggestion.\n state = state.apply(state.tr.insertText(' '));\n expect(seen[seen.length - 1].active).to.equal(false);\n });\n\n it('does not trigger suggestions mid-word', () => {\n const seen: SuggestionMatch[] = [];\n const state = createEditorState({\n doc: htmlToDoc(defaultSchema, '<p></p>'),\n mentions: { getTriggers: () => ['@'], onChange: m => seen.push(m) },\n });\n state.apply(state.tr.insertText('email@example', 1));\n expect(seen.every(m => !m.active)).to.equal(true);\n });\n\n it('finds, steps through, and replaces matches', () => {\n let state = createEditorState({\n doc: htmlToDoc(defaultSchema, '<p>cat dog cat</p><p>Cat nap</p>'),\n });\n state = state.apply(searchTr(state, 'cat'));\n expect(getFindState(state).matches.length).to.equal(3);\n expect(getFindState(state).activeIndex).to.equal(0);\n\n state = state.apply(findStepTr(state, 'next'));\n expect(getFindState(state).activeIndex).to.equal(1);\n state = state.apply(findStepTr(state, 'prev'));\n expect(getFindState(state).activeIndex).to.equal(0);\n\n state = state.apply(replaceActiveTr(state, 'ferret')!);\n expect(docToHtml(state.doc)).to.include('ferret dog cat');\n // Matches recompute after the doc change.\n expect(getFindState(state).matches.length).to.equal(2);\n\n state = state.apply(replaceAllTr(state, 'newt')!);\n expect(getFindState(state).matches.length).to.equal(0);\n expect(docToHtml(state.doc)).to.equal('<p>ferret dog newt</p><p>newt nap</p>');\n });\n\n it('respects case sensitivity in find', () => {\n let state = createEditorState({\n doc: htmlToDoc(defaultSchema, '<p>Cat cat CAT</p>'),\n });\n state = state.apply(searchTr(state, 'cat', true));\n expect(getFindState(state).matches.length).to.equal(1);\n });\n\n it('counts words and characters', () => {\n const doc = htmlToDoc(defaultSchema, '<p>one two</p><p>three</p>');\n expect(countWords(doc)).to.deep.equal({ words: 3, characters: 12 });\n expect(countWords(htmlToDoc(defaultSchema, ''))).to.deep.equal({\n words: 0,\n characters: 0,\n });\n });\n});\n\ndescribe('small features', () => {\n it('round-trips checklists', () => {\n const html =\n '<ul data-task-list=\"true\"><li data-task-item=\"true\" data-checked=\"true\"><p>done</p></li>' +\n '<li data-task-item=\"true\" data-checked=\"false\"><p>todo</p></li></ul>';\n const doc = htmlToDoc(defaultSchema, html);\n expect(doc.firstChild!.type.name).to.equal('task_list');\n expect(doc.firstChild!.firstChild!.attrs.checked).to.equal(true);\n const out = docToHtml(doc);\n expect(out).to.include('data-checked=\"true\"');\n expect(htmlToDoc(defaultSchema, out).eq(doc)).to.equal(true);\n });\n\n it('plain lists still parse as bullet lists', () => {\n const doc = htmlToDoc(defaultSchema, '<ul><li><p>plain</p></li></ul>');\n expect(doc.firstChild!.type.name).to.equal('bullet_list');\n });\n\n it('toggles checklists and converts bullet lists in place', () => {\n let state = stateWithAllSelected('<p>task</p>');\n getCommand(state, 'taskList')!(state, tr => {\n state = state.apply(tr);\n });\n expect(state.doc.firstChild!.type.name).to.equal('task_list');\n\n // Convert to bullet list: items must be remapped too.\n getCommand(state, 'bulletList')!(state, tr => {\n state = state.apply(tr);\n });\n expect(state.doc.firstChild!.type.name).to.equal('bullet_list');\n expect(state.doc.firstChild!.firstChild!.type.name).to.equal('list_item');\n\n // And back to a checklist.\n getCommand(state, 'taskList')!(state, tr => {\n state = state.apply(tr);\n });\n expect(state.doc.firstChild!.firstChild!.type.name).to.equal('task_item');\n });\n\n it('enforces maxLength but always allows shrinking', () => {\n let state = createEditorState({\n doc: htmlToDoc(defaultSchema, '<p>12345678</p>'),\n getMaxLength: () => 10,\n });\n state = state.apply(state.tr.insertText('90', 9));\n expect(state.doc.textContent).to.equal('1234567890');\n\n // Growing past the limit is rejected: the state stays unchanged.\n const attempted = state.apply(state.tr.insertText('x', 11));\n expect(attempted.doc.textContent).to.equal('1234567890');\n\n // Deleting is always allowed.\n state = state.apply(state.tr.delete(1, 6));\n expect(state.doc.textContent).to.equal('67890');\n });\n\n it('suggestion minQueryLength keeps short queries inactive', () => {\n const seen: SuggestionMatch[] = [];\n let state = createEditorState({\n doc: htmlToDoc(defaultSchema, '<p></p>'),\n emoji: { onChange: m => seen.push(m) },\n });\n state = state.apply(state.tr.insertText(':s', 1));\n expect(seen.filter(m => m.active)).to.have.length(0);\n state = state.apply(state.tr.insertText('mi'));\n const last = seen[seen.length - 1];\n expect(last.active).to.equal(true);\n expect(last.query).to.equal('smi');\n });\n});\n\ndescribe('embeds', () => {\n it('converts provider share URLs to embed URLs', () => {\n expect(toEmbedUrl('https://www.youtube.com/watch?v=dQw4w9WgXcQ')).to.deep.equal({\n src: 'https://www.youtube-nocookie.com/embed/dQw4w9WgXcQ',\n provider: 'youtube',\n });\n expect(toEmbedUrl('https://youtu.be/dQw4w9WgXcQ')!.src).to.include('/embed/dQw4w9WgXcQ');\n expect(toEmbedUrl('https://www.youtube.com/shorts/dQw4w9WgXcQ')!.provider).to.equal('youtube');\n expect(toEmbedUrl('https://vimeo.com/123456789')).to.deep.equal({\n src: 'https://player.vimeo.com/video/123456789',\n provider: 'vimeo',\n });\n expect(\n toEmbedUrl('https://www.loom.com/share/abcdef0123456789abcdef0123456789')!.provider\n ).to.equal('loom');\n });\n\n it('rejects non-provider and non-https URLs', () => {\n expect(toEmbedUrl('https://evil.example.com/embed/x')).to.equal(null);\n expect(toEmbedUrl('http://www.youtube.com/watch?v=dQw4w9WgXcQ')).to.equal(null);\n expect(toEmbedUrl('javascript:alert(1)')).to.equal(null);\n expect(toEmbedUrl('https://youtube.com.evil.com/watch?v=x')).to.equal(null);\n expect(isAllowedEmbedSrc('https://evil.com/embed/x')).to.equal(false);\n });\n\n it('keeps allowlisted iframes through sanitization, drops the rest', () => {\n const good = sanitizeHtml(\n '<div data-embed-provider=\"youtube\"><iframe src=\"https://www.youtube-nocookie.com/embed/abc123xyz\"></iframe></div>'\n );\n expect(good).to.include('youtube-nocookie.com/embed');\n const evil = sanitizeHtml('<iframe src=\"https://evil.example.com/steal\"></iframe><p>ok</p>');\n expect(evil).to.equal('<p>ok</p>');\n });\n\n it('round-trips embed nodes', () => {\n const html =\n '<div data-embed-provider=\"youtube\"><iframe src=\"https://www.youtube-nocookie.com/embed/abc123xyz\" title=\"Demo\"></iframe></div>';\n const doc = htmlToDoc(defaultSchema, html);\n expect(doc.firstChild!.type.name).to.equal('embed');\n const out = docToHtml(doc);\n expect(out).to.include('data-embed-provider=\"youtube\"');\n expect(htmlToDoc(defaultSchema, out).eq(doc)).to.equal(true);\n });\n\n it('inserts embeds via the insertEmbed command', () => {\n let state = stateWithAllSelected('<p></p>');\n getCommand(state, 'insertEmbed', {\n src: 'https://player.vimeo.com/video/123456789',\n provider: 'vimeo',\n })!(state, tr => {\n state = state.apply(tr);\n });\n expect(state.doc.firstChild!.type.name).to.equal('embed');\n });\n});\n\ndescribe('code highlighting', () => {\n it('produces token decorations for code blocks', () => {\n const state = createEditorState({\n doc: htmlToDoc(\n defaultSchema,\n '<pre data-language=\"javascript\"><code>const answer = 42; // why</code></pre>'\n ),\n });\n const set = codeHighlightKey.getState(state)!;\n const decos = set.find();\n expect(decos.length).to.be.greaterThan(2);\n });\n\n it('skips plaintext blocks and updates the language attr', () => {\n let state = createEditorState({\n doc: htmlToDoc(\n defaultSchema,\n '<pre data-language=\"plaintext\"><code>const answer = 42;</code></pre>'\n ),\n });\n expect(codeHighlightKey.getState(state)!.find().length).to.equal(0);\n\n state = state.apply(state.tr.setSelection(TextSelection.near(state.doc.resolve(1))));\n getCommand(state, 'setCodeBlockLanguage', { language: 'javascript' })!(state, tr => {\n state = state.apply(tr);\n });\n expect(state.doc.firstChild!.attrs.language).to.equal('javascript');\n expect(codeHighlightKey.getState(state)!.find().length).to.be.greaterThan(1);\n });\n});\n\ndescribe('phase 4: subscript & superscript', () => {\n it('round-trips sub and sup marks', () => {\n for (const html of ['<p>H<sub>2</sub>O</p>', '<p>x<sup>2</sup></p>']) {\n const doc = htmlToDoc(defaultSchema, html);\n expect(docToHtml(doc)).to.equal(html);\n expect(htmlToDoc(defaultSchema, docToHtml(doc)).eq(doc)).to.equal(true);\n }\n });\n\n it('parses vertical-align styles pasted from Word/Docs', () => {\n expect(\n docToHtml(htmlToDoc(defaultSchema, '<p><span style=\"vertical-align: sub\">2</span></p>'))\n ).to.include('<sub>');\n expect(\n docToHtml(htmlToDoc(defaultSchema, '<p><span style=\"vertical-align: super\">2</span></p>'))\n ).to.include('<sup>');\n });\n\n it('toggles sub/sup and keeps them mutually exclusive', () => {\n let state = stateWithAllSelected('<p>x</p>');\n getCommand(state, 'subscript')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p><sub>x</sub></p>');\n // Applying superscript over a subscript replaces it (excludes).\n getCommand(state, 'superscript')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p><sup>x</sup></p>');\n });\n\n it('reports sub/sup in toolbar state', () => {\n expect(computeToolbarState(stateWithAllSelected('<p><sub>x</sub></p>')).subscript).to.equal(\n true\n );\n expect(\n computeToolbarState(stateWithAllSelected('<p><sup>x</sup></p>')).superscript\n ).to.equal(true);\n });\n});\n\ndescribe('phase 4: paste as plain text', () => {\n it('builds a plain-text slice splitting on newlines', () => {\n const slice = plainTextSlice(defaultSchema, 'line1\\nline2');\n expect(slice.content.childCount).to.equal(2);\n expect(slice.content.firstChild!.textContent).to.equal('line1');\n expect(slice.content.lastChild!.textContent).to.equal('line2');\n });\n\n it('strips marks and block structure from a rich slice', () => {\n const rich = htmlToSlice(defaultSchema, '<h2><strong>bold</strong> head</h2>');\n const plain = stripSliceFormatting(defaultSchema, rich);\n const para = plain.content.firstChild!;\n expect(para.type.name).to.equal('paragraph');\n expect(para.textContent).to.equal('bold head');\n expect(para.firstChild!.marks.length).to.equal(0);\n });\n\n it('only strips when the toggle reads true', () => {\n let force = false;\n const state = createEditorState({ getForcePlainText: () => force });\n const paste = state.plugins\n .map(p => p.props?.transformPasted)\n .find(Boolean) as unknown as (slice: unknown, ...rest: unknown[]) => any;\n const rich = htmlToSlice(defaultSchema, '<p><strong>bold</strong></p>');\n // Off: slice passes through unchanged.\n expect(paste(rich).eq(rich)).to.equal(true);\n // On: formatting is dropped.\n force = true;\n const out = paste(rich);\n expect(out.content.firstChild.firstChild.marks.length).to.equal(0);\n });\n});\n\ndescribe('phase 4: more code languages', () => {\n it('highlights newly registered languages', () => {\n for (const language of ['go', 'rust', 'ruby', 'csharp']) {\n const state = createEditorState({\n doc: htmlToDoc(\n defaultSchema,\n `<pre data-language=\"${language}\"><code>fn main() { let x = 1; }</code></pre>`\n ),\n });\n expect(codeHighlightKey.getState(state)!.find().length, language).to.be.greaterThan(0);\n }\n });\n});\n\ndescribe('phase 4: markdown export', () => {\n const cases: [string, string][] = [\n ['<h2>Title</h2><p>Hello <strong>bold</strong> and <em>it</em></p>', '## Title\\n\\nHello **bold** and *it*\\n'],\n ['<ul><li><p>one</p></li><li><p>two</p></li></ul>', '- one\\n- two\\n'],\n ['<ol><li><p>a</p></li><li><p>b</p></li></ol>', '1. a\\n2. b\\n'],\n ['<blockquote><p>quoted</p></blockquote>', '> quoted\\n'],\n ['<p><a href=\"https://x.dev\">link</a></p>', '[link](https://x.dev)\\n'],\n ['<p><code>x()</code></p>', '`x()`\\n'],\n ['<pre data-language=\"js\"><code>const a = 1;</code></pre>', '```js\\nconst a = 1;\\n```\\n'],\n ['<p><img src=\"https://x.dev/a.png\" alt=\"A\"></p>', '![A](https://x.dev/a.png)\\n'],\n ['<hr>', '---\\n'],\n ['<p>H<sub>2</sub>O and x<sup>2</sup></p>', 'H<sub>2</sub>O and x<sup>2</sup>\\n'],\n ];\n\n for (const [input, expected] of cases) {\n it(`serializes ${input.slice(0, 36)}`, () => {\n expect(docToMarkdown(htmlToDoc(defaultSchema, input))).to.equal(expected);\n });\n }\n\n it('serializes checklists with checked state', () => {\n const html =\n '<ul data-task-list=\"true\"><li data-task-item=\"true\" data-checked=\"true\"><p>done</p></li>' +\n '<li data-task-item=\"true\" data-checked=\"false\"><p>todo</p></li></ul>';\n expect(docToMarkdown(htmlToDoc(defaultSchema, html))).to.equal('- [x] done\\n- [ ] todo\\n');\n });\n\n it('serializes a GitHub-flavored table', () => {\n const html =\n '<table><tbody><tr><th><p>h1</p></th><th><p>h2</p></th></tr>' +\n '<tr><td><p>a</p></td><td><p>b</p></td></tr></tbody></table>';\n expect(docToMarkdown(htmlToDoc(defaultSchema, html))).to.equal(\n '| h1 | h2 |\\n| --- | --- |\\n| a | b |\\n'\n );\n });\n\n it('returns an empty string for an empty document', () => {\n expect(docToMarkdown(htmlToDoc(defaultSchema, '<p></p>'))).to.equal('');\n });\n});\n\ndescribe('computeToolbarState', () => {\n it('reports active marks and block info', () => {\n const state = stateWithAllSelected('<h3><strong>bold heading</strong></h3>');\n const ts = computeToolbarState(state);\n expect(ts.bold).to.equal(true);\n expect(ts.italic).to.equal(false);\n expect(ts.blockType).to.equal('heading');\n expect(ts.headingLevel).to.equal(3);\n });\n\n it('reports list and link context', () => {\n const state = stateWithAllSelected(\n '<ul><li><p><a href=\"https://x.dev\">in list</a></p></li></ul>'\n );\n const ts = computeToolbarState(state);\n expect(ts.inBulletList).to.equal(true);\n expect(ts.linkActive).to.equal(true);\n expect(ts.linkHref).to.equal('https://x.dev');\n });\n\n it('reports block info for a Ctrl+A AllSelection', () => {\n const doc = htmlToDoc(defaultSchema, '<h1>sdasd</h1>');\n const base = createEditorState({ doc });\n const state = base.apply(base.tr.setSelection(new AllSelection(base.doc)));\n const ts = computeToolbarState(state);\n expect(ts.blockType).to.equal('heading');\n expect(ts.headingLevel).to.equal(1);\n });\n});\n\ndescribe('indent & outdent', () => {\n /** Cursor inside the second item of a two-item bullet list. */\n function stateInSecondItem() {\n const doc = htmlToDoc(\n defaultSchema,\n '<ul><li><p>one</p></li><li><p>two</p></li></ul>'\n );\n const state = createEditorState({ doc });\n // Position inside \"two\" (after \"one\" paragraph + item boundaries).\n const pos = state.doc.content.size - 4;\n return state.apply(\n state.tr.setSelection(TextSelection.create(state.doc, pos))\n );\n }\n\n it('indent sinks a list item into the previous one', () => {\n let state = stateInSecondItem();\n const applied = getCommand(state, 'indent')!(state, tr => {\n state = state.apply(tr);\n });\n expect(applied).to.equal(true);\n expect(docToHtml(state.doc)).to.equal(\n '<ul><li><p>one</p><ul><li><p>two</p></li></ul></li></ul>'\n );\n });\n\n it('outdent lifts a nested item back out', () => {\n let state = stateInSecondItem();\n getCommand(state, 'indent')!(state, tr => {\n state = state.apply(tr);\n });\n getCommand(state, 'outdent')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal(\n '<ul><li><p>one</p></li><li><p>two</p></li></ul>'\n );\n });\n\n it('indent adds margin steps to plain paragraphs', () => {\n let state = stateWithAllSelected('<p>text</p>');\n getCommand(state, 'indent')!(state, tr => {\n state = state.apply(tr);\n });\n // Browsers may serialize style attributes with a trailing semicolon.\n expect(docToHtml(state.doc)).to.include('margin-inline-start: 40px');\n getCommand(state, 'indent')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('margin-inline-start: 80px');\n getCommand(state, 'outdent')!(state, tr => {\n state = state.apply(tr);\n });\n getCommand(state, 'outdent')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p>text</p>');\n });\n\n it('outdent at indent 0 outside lists and quotes does nothing', () => {\n let state = stateWithAllSelected('<p>text</p>');\n const applied = getCommand(state, 'outdent')!(state, tr => {\n state = state.apply(tr);\n });\n expect(applied).to.equal(false);\n });\n\n it('outdent lifts a block out of a blockquote', () => {\n let state = stateWithAllSelected('<blockquote><p>quoted</p></blockquote>');\n const applied = getCommand(state, 'outdent')!(state, tr => {\n state = state.apply(tr);\n });\n expect(applied).to.equal(true);\n expect(docToHtml(state.doc)).to.equal('<p>quoted</p>');\n });\n});\n\ndescribe('list properties', () => {\n it('sets and clears bullet marker styles', () => {\n let state = stateWithAllSelected('<ul><li><p>a</p></li></ul>');\n getCommand(state, 'setListStyle', { style: 'square' })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('list-style-type: square');\n getCommand(state, 'setListStyle', { style: null })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<ul><li><p>a</p></li></ul>');\n });\n\n it('sets numbering style as the HTML type attribute', () => {\n let state = stateWithAllSelected('<ol><li><p>a</p></li></ol>');\n getCommand(state, 'setListStyle', { style: 'lower-roman' })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<ol type=\"i\"><li><p>a</p></li></ol>');\n });\n\n it('sets the start number of an ordered list', () => {\n let state = stateWithAllSelected('<ol><li><p>a</p></li></ol>');\n getCommand(state, 'setListStart', { start: 5 })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<ol start=\"5\"><li><p>a</p></li></ol>');\n });\n\n it('round-trips ol type through parsing', () => {\n const doc = htmlToDoc(defaultSchema, '<ol type=\"A\" start=\"3\"><li><p>x</p></li></ol>');\n expect(docToHtml(doc)).to.equal('<ol start=\"3\" type=\"A\"><li><p>x</p></li></ol>');\n });\n});\n\ndescribe('figure & image commands', () => {\n /** State with a NodeSelection on the inline image. */\n function stateWithImageSelected() {\n const doc = htmlToDoc(defaultSchema, '<p><img src=\"https://x.co/i.png\" alt=\"pic\"></p>');\n const state = createEditorState({ doc });\n // Image node position: inside the paragraph at pos 1.\n return state.apply(state.tr.setSelection(NodeSelection.create(state.doc, 1)));\n }\n\n it('parses and serializes a figure with caption', () => {\n const html =\n '<figure><img src=\"https://x.co/i.png\" alt=\"pic\"><figcaption>My caption</figcaption></figure>';\n const doc = htmlToDoc(defaultSchema, html);\n const out = docToHtml(doc);\n expect(out).to.include('<figure');\n expect(out).to.include('src=\"https://x.co/i.png\"');\n expect(out).to.include('<figcaption');\n expect(out).to.include('My caption');\n });\n\n it('parses image width from inline style', () => {\n const doc = htmlToDoc(defaultSchema, '<p><img src=\"https://x.co/i.png\" style=\"width: 240px\"></p>');\n expect(docToHtml(doc)).to.include('width: 240px');\n });\n\n it('toggleImageCaption converts an inline image into a figure', () => {\n let state = stateWithImageSelected();\n const applied = getCommand(state, 'toggleImageCaption')!(state, tr => {\n state = state.apply(tr);\n });\n expect(applied).to.equal(true);\n const out = docToHtml(state.doc);\n expect(out).to.include('<figure');\n expect(out).to.include('pic'); // alt prefills the caption\n });\n\n it('toggleImageCaption converts a figure back to an inline image', () => {\n let state = stateWithAllSelected(\n '<figure><img src=\"https://x.co/i.png\"><figcaption>cap</figcaption></figure>'\n );\n // Cursor is inside the caption — selectedImageInfo resolves the figure.\n const applied = getCommand(state, 'toggleImageCaption')!(state, tr => {\n state = state.apply(tr);\n });\n expect(applied).to.equal(true);\n const out = docToHtml(state.doc);\n expect(out).to.not.include('<figure');\n expect(out).to.include('<img');\n });\n\n it('setImageAlign promotes an inline image to an aligned figure', () => {\n let state = stateWithImageSelected();\n getCommand(state, 'setImageAlign', { align: 'center' })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('data-align=\"center\"');\n });\n\n it('setImageWidth writes the width attr', () => {\n let state = stateWithImageSelected();\n getCommand(state, 'setImageWidth', { width: 320 })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('width: 320px');\n });\n\n it('deleteImage removes the selected image', () => {\n let state = stateWithImageSelected();\n getCommand(state, 'deleteImage')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.not.include('<img');\n });\n});\n\ndescribe('paste from Office', () => {\n it('detects Word and Google Docs clipboard HTML', () => {\n expect(isOfficeHtml('<p class=\"MsoNormal\">x</p>')).to.equal(true);\n expect(isOfficeHtml('<b id=\"docs-internal-guid-abc\"><p>x</p></b>')).to.equal(true);\n expect(isOfficeHtml('<p>plain</p>')).to.equal(false);\n });\n\n it('converts Word list paragraphs into a real bullet list', () => {\n const word =\n '<p class=\"MsoListParagraph\" style=\"mso-list:l0 level1 lfo1\">' +\n '<span style=\"mso-list:Ignore\">·<span>&nbsp;</span></span>Alpha</p>' +\n '<p class=\"MsoListParagraph\" style=\"mso-list:l0 level1 lfo1\">' +\n '<span style=\"mso-list:Ignore\">·<span>&nbsp;</span></span>Beta</p>';\n const out = cleanOfficeHtml(word);\n expect(out).to.include('<ul>');\n expect(out).to.include('Alpha');\n expect(out).to.include('Beta');\n expect(out).to.not.include('mso-list');\n });\n\n it('converts numbered Word paragraphs into an ordered list with nesting', () => {\n const word =\n '<p style=\"mso-list:l0 level1 lfo1\"><span style=\"mso-list:Ignore\">1.</span>One</p>' +\n '<p style=\"mso-list:l0 level2 lfo1\"><span style=\"mso-list:Ignore\">a.</span>Nested</p>' +\n '<p style=\"mso-list:l0 level1 lfo1\"><span style=\"mso-list:Ignore\">2.</span>Two</p>';\n const out = cleanOfficeHtml(word);\n expect(out.indexOf('<ol>')).to.be.greaterThan(-1);\n // Nested list sits inside the first item.\n expect(out.indexOf('Nested')).to.be.greaterThan(out.indexOf('One'));\n expect(out.indexOf('Two')).to.be.greaterThan(out.indexOf('Nested'));\n });\n\n it('unwraps the Google Docs bold guid wrapper', () => {\n const gdocs =\n '<b id=\"docs-internal-guid-x\" style=\"font-weight:normal\"><p>hello</p></b>';\n const out = cleanOfficeHtml(gdocs);\n expect(out).to.equal('<p>hello</p>');\n });\n\n it('drops conditional comments and o:p tags', () => {\n // Downlevel-hidden conditional: the marker content is inside the comment.\n const word = '<p><!--[if !supportLists]>junk<![endif]-->text<o:p></o:p></p>';\n const out = cleanOfficeHtml(word);\n expect(out).to.not.include('junk');\n expect(out).to.include('text');\n });\n});\n\ndescribe('line height', () => {\n it('sets and clears line height on textblocks', () => {\n let state = stateWithAllSelected('<p>hello</p>');\n getCommand(state, 'lineHeight', { lineHeight: '1.5' })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('line-height: 1.5');\n expect(computeToolbarState(state).lineHeight).to.equal('1.5');\n getCommand(state, 'lineHeight', { lineHeight: null })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p>hello</p>');\n });\n\n it('parses line-height styles, converting percentages', () => {\n const doc = htmlToDoc(defaultSchema, '<p style=\"line-height: 150%\">a</p>');\n expect(docToHtml(doc)).to.include('line-height: 1.5');\n });\n\n it('survives the sanitizer', () => {\n expect(sanitizeHtml('<p style=\"line-height: 2\">a</p>')).to.include('line-height: 2');\n });\n\n it('is cleared by clearFormatting', () => {\n let state = stateWithAllSelected('<p style=\"line-height: 2\">hello</p>');\n getCommand(state, 'clearFormatting')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p>hello</p>');\n });\n});\n\ndescribe('bookmarks', () => {\n it('inserts a bookmark anchor at the cursor', () => {\n let state = createEditorState({ doc: htmlToDoc(defaultSchema, '<p>hello</p>') });\n state = state.apply(\n state.tr.setSelection(TextSelection.create(state.doc, 1))\n );\n getCommand(state, 'insertBookmark', { id: 'intro' })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p><a id=\"intro\" data-bookmark=\"true\"></a>hello</p>');\n });\n\n it('rejects empty ids', () => {\n const state = createEditorState({ doc: htmlToDoc(defaultSchema, '<p>hello</p>') });\n expect(getCommand(state, 'insertBookmark', { id: ' ' })!(state)).to.equal(false);\n });\n\n it('round-trips id and legacy name anchors, but not links', () => {\n const doc = htmlToDoc(\n defaultSchema,\n '<p><a id=\"one\"></a>x<a name=\"two\"></a>y<a href=\"https://a.b\">link</a></p>'\n );\n const out = docToHtml(doc);\n expect(out).to.include('<a id=\"one\" data-bookmark=\"true\"></a>');\n expect(out).to.include('<a id=\"two\" data-bookmark=\"true\"></a>');\n expect(out).to.include('<a href=\"https://a.b\">link</a>');\n });\n});\n\ndescribe('layout tables', () => {\n const table = '<table><tr><td><p>a</p></td></tr></table>';\n\n function stateInTable(html: string) {\n const doc = htmlToDoc(defaultSchema, html);\n const state = createEditorState({ doc });\n // Place the cursor inside the first cell's paragraph.\n let pos = 0;\n state.doc.descendants((node, p) => {\n if (!pos && node.isTextblock) pos = p + 1;\n return !pos;\n });\n return state.apply(state.tr.setSelection(TextSelection.create(state.doc, pos)));\n }\n\n it('toggles the surrounding table into layout mode and back', () => {\n let state = stateInTable(table);\n getCommand(state, 'toggleLayoutTable')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('<table role=\"presentation\" data-layout=\"true\">');\n expect(computeToolbarState(state).tableLayout).to.equal(true);\n getCommand(state, 'toggleLayoutTable')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.not.include('data-layout');\n });\n\n it('parses role=\"presentation\" tables as layout tables', () => {\n const doc = htmlToDoc(\n defaultSchema,\n '<table role=\"presentation\"><tr><td><p>a</p></td></tr></table>'\n );\n expect(docToHtml(doc)).to.include('role=\"presentation\"');\n });\n\n it('returns false outside a table', () => {\n const state = stateWithAllSelected('<p>hello</p>');\n expect(getCommand(state, 'toggleLayoutTable')!(state)).to.equal(false);\n });\n});\n\ndescribe('multi-level lists', () => {\n const nested =\n '<ol data-list-style=\"multilevel\"><li><p>one</p><ol><li><p>deep</p></li></ol></li></ol>';\n\n it('round-trips the multilevel marker', () => {\n const doc = htmlToDoc(defaultSchema, nested);\n expect(docToHtml(doc)).to.include('data-list-style=\"multilevel\"');\n });\n\n it('survives the sanitizer', () => {\n expect(sanitizeHtml(nested)).to.include('data-list-style=\"multilevel\"');\n });\n\n it('applies multilevel to the outermost ordered list from a nested item', () => {\n const html = '<ol><li><p>one</p><ol><li><p>deep</p></li></ol></li></ol>';\n let state = createEditorState({ doc: htmlToDoc(defaultSchema, html) });\n let pos = 0;\n state.doc.descendants((node, p) => {\n if (node.isTextblock && node.textContent === 'deep') pos = p + 1;\n return pos === 0;\n });\n state = state.apply(state.tr.setSelection(TextSelection.create(state.doc, pos)));\n getCommand(state, 'setListStyle', { style: 'multilevel' })!(state, tr => {\n state = state.apply(tr);\n });\n const out = docToHtml(state.doc);\n // The outer list carries the marker, not the nested one.\n expect(out.startsWith('<ol data-list-style=\"multilevel\">')).to.equal(true);\n expect(out.indexOf('data-list-style')).to.equal(out.lastIndexOf('data-list-style'));\n // The toolbar reports it from the nested cursor, and clearing removes it.\n expect(computeToolbarState(state).listStyle).to.equal('multilevel');\n getCommand(state, 'setListStyle', { style: null })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.not.include('data-list-style');\n });\n});\n"]}
1
+ {"version":3,"file":"pm.test.js","sourceRoot":"","sources":["../../../../src/nile-wysiwyg-editor/engine/pm.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from '@open-wc/testing';\nimport { TextSelection, NodeSelection, AllSelection } from 'prosemirror-state';\nimport {\n defaultSchema,\n htmlToDoc,\n htmlToSlice,\n docToHtml,\n isOfficeHtml,\n cleanOfficeHtml,\n docToMarkdown,\n sanitizeHtml,\n createEditorState,\n getCommand,\n computeToolbarState,\n isDocEmpty,\n countWords,\n getFindState,\n searchTr,\n findStepTr,\n replaceActiveTr,\n replaceAllTr,\n plainTextSlice,\n stripSliceFormatting,\n} from './index';\nimport type { SuggestionMatch } from './plugins/suggestions';\nimport { toEmbedUrl, isAllowedEmbedSrc } from './plugins/embeds';\nimport { codeHighlightKey } from './plugins/code-highlight';\n\n/** Builds an editor state with the whole document selected. */\nfunction stateWithAllSelected(html: string) {\n const doc = htmlToDoc(defaultSchema, html);\n const state = createEditorState({ doc });\n const selection = TextSelection.create(state.doc, 1, state.doc.content.size - 1);\n return state.apply(state.tr.setSelection(selection));\n}\n\ndescribe('sanitizeHtml', () => {\n it('removes script elements entirely', () => {\n expect(sanitizeHtml('<p>hi</p><script>alert(1)</script>')).to.equal('<p>hi</p>');\n });\n\n it('removes inline event handlers', () => {\n const out = sanitizeHtml('<p onclick=\"alert(1)\" onmouseover=\"x()\">hi</p>');\n expect(out).to.not.include('onclick').and.to.not.include('onmouseover');\n });\n\n it('drops javascript: URLs', () => {\n const out = sanitizeHtml('<a href=\"javascript:alert(1)\">x</a>');\n expect(out).to.not.include('javascript:');\n });\n\n it('keeps safe links and forces noopener on _blank', () => {\n const out = sanitizeHtml('<a href=\"https://example.com\" target=\"_blank\">x</a>');\n expect(out).to.include('https://example.com');\n expect(out).to.include('noopener');\n });\n\n it('filters style declarations to the allowed set', () => {\n const out = sanitizeHtml(\n '<span style=\"color: red; position: fixed; background-image: url(x)\">x</span>'\n );\n expect(out).to.include('color: red');\n expect(out).to.not.include('position');\n expect(out).to.not.include('url(');\n });\n\n it('unwraps unknown elements but keeps their content', () => {\n expect(sanitizeHtml('<article><p>kept</p></article>')).to.equal('<p>kept</p>');\n });\n\n it('drops non-https iframes and forms with content', () => {\n const out = sanitizeHtml(\n '<iframe src=\"x\"></iframe><form><input></form><p>ok</p>'\n );\n expect(out).to.equal('<p>ok</p>');\n });\n\n it('keeps <style> blocks and sanitizes their CSS', () => {\n const out = sanitizeHtml(\n '<style>@import url(\"http://evil/x.css\"); p{color:red} a{behavior:url(x.htc)} ' +\n 'b{width:expression(alert(1))} c{background:url(http://evil/x.png)}</style><p>ok</p>'\n );\n expect(out).to.include('<style>');\n expect(out).to.include('color:red');\n expect(out).to.include('<p>ok</p>');\n expect(out).to.not.match(/@import/i);\n expect(out).to.not.match(/expression\\s*\\(/i);\n expect(out).to.not.match(/behavior\\s*:/i);\n expect(out).to.not.match(/url\\(\\s*['\"]?http/i);\n });\n\n it('keeps safe data-image and #fragment url() in <style>', () => {\n const out = sanitizeHtml(\n '<style>a{background:url(data:image/png;base64,AAAA)} b{clip-path:url(#f)}</style>'\n );\n expect(out).to.include('url(data:image/png');\n expect(out).to.include('url(#f)');\n });\n});\n\ndescribe('serializer round-trip', () => {\n const cases = [\n '<p>plain text</p>',\n '<h2>heading</h2><p>body</p>',\n '<p><strong>bold</strong> and <em>italic</em> and <u>underlined</u></p>',\n '<ul><li><p>one</p></li><li><p>two</p></li></ul>',\n '<ol><li><p>first</p></li></ol>',\n '<blockquote><p>quoted</p></blockquote>',\n '<p><a href=\"https://example.com\">link</a></p>',\n '<p style=\"text-align: center\">centered</p>',\n '<p><span style=\"color: rgb(255, 0, 0)\">red</span></p>',\n '<p>line<br>break</p>',\n '<hr>',\n ];\n\n for (const html of cases) {\n it(`round-trips ${html.slice(0, 40)}`, () => {\n const doc = htmlToDoc(defaultSchema, html);\n const out = docToHtml(doc);\n const reparsed = htmlToDoc(defaultSchema, out);\n expect(reparsed.eq(doc), `stable parse for ${html}`).to.equal(true);\n });\n }\n\n it('parses Word-style font-weight styles as bold', () => {\n const doc = htmlToDoc(defaultSchema, '<p><span style=\"font-weight: 700\">x</span></p>');\n expect(docToHtml(doc)).to.include('<strong>');\n });\n\n it('round-trips an author <style> block through the schema', () => {\n const doc = htmlToDoc(defaultSchema, '<style>p{color:red}</style><p>hi</p>');\n expect(doc.firstChild!.type.name).to.equal('styleBlock');\n const out = docToHtml(doc);\n expect(out).to.include('<style>');\n expect(out).to.match(/color:\\s*red/i);\n expect(out).to.include('<p>hi</p>');\n // Malicious CSS is neutralized on the round-trip, not just at the surface.\n const evil = docToHtml(\n htmlToDoc(defaultSchema, '<style>@import url(http://evil);x{color:blue}</style><p>ok</p>')\n );\n expect(evil).to.include('<style>');\n expect(evil).to.not.match(/@import/i);\n });\n\n it('detects empty documents', () => {\n expect(isDocEmpty(htmlToDoc(defaultSchema, ''))).to.equal(true);\n expect(isDocEmpty(htmlToDoc(defaultSchema, '<p></p>'))).to.equal(true);\n expect(isDocEmpty(htmlToDoc(defaultSchema, '<p>x</p>'))).to.equal(false);\n });\n});\n\ndescribe('commands', () => {\n it('toggles bold over a selection', () => {\n let state = stateWithAllSelected('<p>hello</p>');\n const bold = getCommand(state, 'bold')!;\n bold(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p><strong>hello</strong></p>');\n });\n\n it('sets and clears headings', () => {\n let state = stateWithAllSelected('<p>title</p>');\n getCommand(state, 'heading', { level: 2 })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<h2>title</h2>');\n getCommand(state, 'paragraph')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p>title</p>');\n });\n\n it('wraps and lifts bullet lists', () => {\n let state = stateWithAllSelected('<p>item</p>');\n getCommand(state, 'bulletList')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('<ul>');\n getCommand(state, 'bulletList')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p>item</p>');\n });\n\n it('converts between list types in place', () => {\n let state = stateWithAllSelected('<ul><li><p>item</p></li></ul>');\n getCommand(state, 'orderedList')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('<ol>');\n expect(docToHtml(state.doc)).to.not.include('<ul>');\n });\n\n it('sets alignment on textblocks', () => {\n let state = stateWithAllSelected('<p>text</p>');\n getCommand(state, 'align', { align: 'right' })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('text-align: right');\n });\n\n it('applies and removes links', () => {\n let state = stateWithAllSelected('<p>click</p>');\n getCommand(state, 'link', { href: 'https://example.com' })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('href=\"https://example.com\"');\n getCommand(state, 'unlink')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p>click</p>');\n });\n\n it('applies text color and clears formatting', () => {\n let state = stateWithAllSelected('<p>color</p>');\n getCommand(state, 'textColor', { color: '#ff0000' })!(state, tr => {\n state = state.apply(tr);\n });\n // Browsers normalize hex colors to rgb() in style attributes.\n expect(docToHtml(state.doc)).to.match(/color: (#ff0000|rgb\\(255, 0, 0\\))/);\n getCommand(state, 'clearFormatting')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p>color</p>');\n });\n});\n\ndescribe('phase 2: rich content', () => {\n it('round-trips tables', () => {\n const html =\n '<table><tbody><tr><th><p>h1</p></th><th><p>h2</p></th></tr>' +\n '<tr><td><p>a</p></td><td><p>b</p></td></tr></tbody></table>';\n const doc = htmlToDoc(defaultSchema, html);\n const out = docToHtml(doc);\n expect(out).to.include('<table');\n expect(out).to.include('<th');\n expect(htmlToDoc(defaultSchema, out).eq(doc)).to.equal(true);\n });\n\n it('keeps colspan/rowspan through sanitization', () => {\n const out = sanitizeHtml('<table><tr><td colspan=\"2\" rowspan=\"3\">x</td></tr></table>');\n expect(out).to.include('colspan=\"2\"');\n expect(out).to.include('rowspan=\"3\"');\n });\n\n it('round-trips inline images', () => {\n const html = '<p>look: <img src=\"https://x.dev/a.png\" alt=\"A\"></p>';\n const doc = htmlToDoc(defaultSchema, html);\n const out = docToHtml(doc);\n expect(out).to.include('src=\"https://x.dev/a.png\"');\n expect(out).to.include('alt=\"A\"');\n expect(htmlToDoc(defaultSchema, out).eq(doc)).to.equal(true);\n });\n\n it('parses bare pasted images', () => {\n const doc = htmlToDoc(defaultSchema, '<p>before</p><img src=\"https://x.dev/a.png\">');\n expect(docToHtml(doc)).to.include('<img src=\"https://x.dev/a.png\"');\n });\n\n it('drops images with unsafe URLs but allows raster data URLs', () => {\n expect(sanitizeHtml('<img src=\"javascript:alert(1)\">')).to.not.include('src');\n expect(\n sanitizeHtml('<img src=\"data:image/png;base64,iVBORw0KGgo=\">')\n ).to.include('data:image/png');\n expect(\n sanitizeHtml('<img src=\"data:image/svg+xml,<svg onload=alert(1)>\">')\n ).to.not.include('svg');\n });\n\n it('round-trips code blocks preserving whitespace', () => {\n const doc = htmlToDoc(\n defaultSchema,\n '<pre data-language=\"js\"><code>const a = 1;\\n indent();</code></pre>'\n );\n const out = docToHtml(doc);\n expect(out).to.include('data-language=\"js\"');\n expect(out).to.include('const a = 1;\\n indent();');\n });\n\n it('toggles code blocks via the codeBlock command', () => {\n let state = stateWithAllSelected('<p>snippet</p>');\n getCommand(state, 'codeBlock')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('<pre');\n getCommand(state, 'codeBlock')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p>snippet</p>');\n });\n\n it('inserts tables and edits rows/columns', () => {\n let state = stateWithAllSelected('<p></p>');\n getCommand(state, 'insertTable', { rows: 2, cols: 2 })!(state, tr => {\n state = state.apply(tr);\n });\n let table = state.doc.firstChild!;\n expect(table.type.name).to.equal('table');\n expect(table.childCount).to.equal(2);\n\n // Put the cursor inside the first cell, then add a row.\n const inside = TextSelection.near(state.doc.resolve(4));\n state = state.apply(state.tr.setSelection(inside));\n getCommand(state, 'addRowAfter')!(state, tr => {\n state = state.apply(tr);\n });\n table = state.doc.firstChild!;\n expect(table.childCount).to.equal(3);\n\n getCommand(state, 'deleteTable')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.not.include('<table');\n });\n\n it('inserts inline images via the insertImage command', () => {\n let state = stateWithAllSelected('<p></p>');\n getCommand(state, 'insertImage', { src: 'https://x.dev/i.png', alt: 'pic' })!(\n state,\n tr => {\n state = state.apply(tr);\n }\n );\n const out = docToHtml(state.doc);\n expect(out).to.include('<img');\n expect(out).to.include('alt=\"pic\"');\n });\n\n it('reports inTable and inCodeBlock in toolbar state', () => {\n let state = stateWithAllSelected('<p></p>');\n getCommand(state, 'insertTable', { rows: 2, cols: 2 })!(state, tr => {\n state = state.apply(tr);\n });\n state = state.apply(state.tr.setSelection(TextSelection.near(state.doc.resolve(4))));\n expect(computeToolbarState(state).inTable).to.equal(true);\n\n const codeState = stateWithAllSelected('<pre><code>x</code></pre>');\n expect(computeToolbarState(codeState).inCodeBlock).to.equal(true);\n });\n});\n\ndescribe('phase 3: productivity', () => {\n it('round-trips mention nodes', () => {\n const html =\n '<p>ping <span data-mention-trigger=\"@\" data-mention-key=\"u1\" data-mention-label=\"Ada\">@Ada</span> now</p>';\n const doc = htmlToDoc(defaultSchema, html);\n const out = docToHtml(doc);\n expect(out).to.include('data-mention-key=\"u1\"');\n expect(out).to.include('data-mention-label=\"Ada\"');\n expect(out).to.include('@Ada');\n expect(htmlToDoc(defaultSchema, out).eq(doc)).to.equal(true);\n });\n\n it('keeps mention data attributes through sanitization', () => {\n const out = sanitizeHtml(\n '<span data-mention-key=\"u1\" data-mention-trigger=\"@\" data-mention-label=\"Ada\" onclick=\"x()\">@Ada</span>'\n );\n expect(out).to.include('data-mention-key=\"u1\"');\n expect(out).to.not.include('onclick');\n });\n\n it('tracks trigger queries through the suggestion plugin', () => {\n const seen: SuggestionMatch[] = [];\n let state = createEditorState({\n doc: htmlToDoc(defaultSchema, '<p></p>'),\n mentions: {\n getTriggers: () => ['@'],\n onChange: match => seen.push(match),\n },\n });\n state = state.apply(state.tr.insertText('hello @ad', 1));\n const last = seen[seen.length - 1];\n expect(last.active).to.equal(true);\n expect(last.trigger).to.equal('@');\n expect(last.query).to.equal('ad');\n\n // A space ends the suggestion.\n state = state.apply(state.tr.insertText(' '));\n expect(seen[seen.length - 1].active).to.equal(false);\n });\n\n it('does not trigger suggestions mid-word', () => {\n const seen: SuggestionMatch[] = [];\n const state = createEditorState({\n doc: htmlToDoc(defaultSchema, '<p></p>'),\n mentions: { getTriggers: () => ['@'], onChange: m => seen.push(m) },\n });\n state.apply(state.tr.insertText('email@example', 1));\n expect(seen.every(m => !m.active)).to.equal(true);\n });\n\n it('finds, steps through, and replaces matches', () => {\n let state = createEditorState({\n doc: htmlToDoc(defaultSchema, '<p>cat dog cat</p><p>Cat nap</p>'),\n });\n state = state.apply(searchTr(state, 'cat'));\n expect(getFindState(state).matches.length).to.equal(3);\n expect(getFindState(state).activeIndex).to.equal(0);\n\n state = state.apply(findStepTr(state, 'next'));\n expect(getFindState(state).activeIndex).to.equal(1);\n state = state.apply(findStepTr(state, 'prev'));\n expect(getFindState(state).activeIndex).to.equal(0);\n\n state = state.apply(replaceActiveTr(state, 'ferret')!);\n expect(docToHtml(state.doc)).to.include('ferret dog cat');\n // Matches recompute after the doc change.\n expect(getFindState(state).matches.length).to.equal(2);\n\n state = state.apply(replaceAllTr(state, 'newt')!);\n expect(getFindState(state).matches.length).to.equal(0);\n expect(docToHtml(state.doc)).to.equal('<p>ferret dog newt</p><p>newt nap</p>');\n });\n\n it('respects case sensitivity in find', () => {\n let state = createEditorState({\n doc: htmlToDoc(defaultSchema, '<p>Cat cat CAT</p>'),\n });\n state = state.apply(searchTr(state, 'cat', true));\n expect(getFindState(state).matches.length).to.equal(1);\n });\n\n it('counts words and characters', () => {\n const doc = htmlToDoc(defaultSchema, '<p>one two</p><p>three</p>');\n expect(countWords(doc)).to.deep.equal({ words: 3, characters: 12 });\n expect(countWords(htmlToDoc(defaultSchema, ''))).to.deep.equal({\n words: 0,\n characters: 0,\n });\n });\n});\n\ndescribe('small features', () => {\n it('round-trips checklists', () => {\n const html =\n '<ul data-task-list=\"true\"><li data-task-item=\"true\" data-checked=\"true\"><p>done</p></li>' +\n '<li data-task-item=\"true\" data-checked=\"false\"><p>todo</p></li></ul>';\n const doc = htmlToDoc(defaultSchema, html);\n expect(doc.firstChild!.type.name).to.equal('task_list');\n expect(doc.firstChild!.firstChild!.attrs.checked).to.equal(true);\n const out = docToHtml(doc);\n expect(out).to.include('data-checked=\"true\"');\n expect(htmlToDoc(defaultSchema, out).eq(doc)).to.equal(true);\n });\n\n it('plain lists still parse as bullet lists', () => {\n const doc = htmlToDoc(defaultSchema, '<ul><li><p>plain</p></li></ul>');\n expect(doc.firstChild!.type.name).to.equal('bullet_list');\n });\n\n it('toggles checklists and converts bullet lists in place', () => {\n let state = stateWithAllSelected('<p>task</p>');\n getCommand(state, 'taskList')!(state, tr => {\n state = state.apply(tr);\n });\n expect(state.doc.firstChild!.type.name).to.equal('task_list');\n\n // Convert to bullet list: items must be remapped too.\n getCommand(state, 'bulletList')!(state, tr => {\n state = state.apply(tr);\n });\n expect(state.doc.firstChild!.type.name).to.equal('bullet_list');\n expect(state.doc.firstChild!.firstChild!.type.name).to.equal('list_item');\n\n // And back to a checklist.\n getCommand(state, 'taskList')!(state, tr => {\n state = state.apply(tr);\n });\n expect(state.doc.firstChild!.firstChild!.type.name).to.equal('task_item');\n });\n\n it('enforces maxLength but always allows shrinking', () => {\n let state = createEditorState({\n doc: htmlToDoc(defaultSchema, '<p>12345678</p>'),\n getMaxLength: () => 10,\n });\n state = state.apply(state.tr.insertText('90', 9));\n expect(state.doc.textContent).to.equal('1234567890');\n\n // Growing past the limit is rejected: the state stays unchanged.\n const attempted = state.apply(state.tr.insertText('x', 11));\n expect(attempted.doc.textContent).to.equal('1234567890');\n\n // Deleting is always allowed.\n state = state.apply(state.tr.delete(1, 6));\n expect(state.doc.textContent).to.equal('67890');\n });\n\n it('suggestion minQueryLength keeps short queries inactive', () => {\n const seen: SuggestionMatch[] = [];\n let state = createEditorState({\n doc: htmlToDoc(defaultSchema, '<p></p>'),\n emoji: { onChange: m => seen.push(m) },\n });\n state = state.apply(state.tr.insertText(':s', 1));\n expect(seen.filter(m => m.active)).to.have.length(0);\n state = state.apply(state.tr.insertText('mi'));\n const last = seen[seen.length - 1];\n expect(last.active).to.equal(true);\n expect(last.query).to.equal('smi');\n });\n});\n\ndescribe('embeds', () => {\n it('converts provider share URLs to embed URLs', () => {\n expect(toEmbedUrl('https://www.youtube.com/watch?v=dQw4w9WgXcQ')).to.deep.equal({\n src: 'https://www.youtube-nocookie.com/embed/dQw4w9WgXcQ',\n provider: 'youtube',\n });\n expect(toEmbedUrl('https://youtu.be/dQw4w9WgXcQ')!.src).to.include('/embed/dQw4w9WgXcQ');\n expect(toEmbedUrl('https://www.youtube.com/shorts/dQw4w9WgXcQ')!.provider).to.equal('youtube');\n expect(toEmbedUrl('https://vimeo.com/123456789')).to.deep.equal({\n src: 'https://player.vimeo.com/video/123456789',\n provider: 'vimeo',\n });\n expect(\n toEmbedUrl('https://www.loom.com/share/abcdef0123456789abcdef0123456789')!.provider\n ).to.equal('loom');\n });\n\n it('accepts any https URL as a generic embed, rejects non-https', () => {\n expect(toEmbedUrl('https://example.com/player/x')).to.deep.equal({\n src: 'https://example.com/player/x',\n provider: 'generic',\n });\n // Lookalike hosts are no longer canonicalized as a provider, just generic.\n expect(toEmbedUrl('https://youtube.com.evil.com/watch?v=x')!.provider).to.equal('generic');\n // Non-https is still refused.\n expect(toEmbedUrl('http://www.youtube.com/watch?v=dQw4w9WgXcQ')).to.equal(null);\n expect(toEmbedUrl('javascript:alert(1)')).to.equal(null);\n expect(isAllowedEmbedSrc('https://example.com/player/x')).to.equal(true);\n expect(isAllowedEmbedSrc('http://example.com/x')).to.equal(false);\n });\n\n it('keeps any https iframe through sanitization but force-sandboxes it', () => {\n const good = sanitizeHtml(\n '<div data-embed-provider=\"youtube\"><iframe src=\"https://www.youtube-nocookie.com/embed/abc123xyz\"></iframe></div>'\n );\n expect(good).to.include('youtube-nocookie.com/embed');\n expect(good).to.include('sandbox=');\n // A non-provider https iframe is kept, but sandboxed and cannot navigate the top.\n const generic = sanitizeHtml('<iframe src=\"https://example.com/player\"></iframe><p>ok</p>');\n expect(generic).to.include('example.com/player');\n expect(generic).to.include('sandbox=');\n expect(generic).to.not.include('allow-top-navigation');\n // Non-https iframes are still dropped entirely.\n const evil = sanitizeHtml('<iframe src=\"http://evil.example.com/steal\"></iframe><p>ok</p>');\n expect(evil).to.equal('<p>ok</p>');\n });\n\n it('round-trips embed nodes', () => {\n const html =\n '<div data-embed-provider=\"youtube\"><iframe src=\"https://www.youtube-nocookie.com/embed/abc123xyz\" title=\"Demo\"></iframe></div>';\n const doc = htmlToDoc(defaultSchema, html);\n expect(doc.firstChild!.type.name).to.equal('embed');\n const out = docToHtml(doc);\n expect(out).to.include('data-embed-provider=\"youtube\"');\n expect(htmlToDoc(defaultSchema, out).eq(doc)).to.equal(true);\n });\n\n it('inserts embeds via the insertEmbed command', () => {\n let state = stateWithAllSelected('<p></p>');\n getCommand(state, 'insertEmbed', {\n src: 'https://player.vimeo.com/video/123456789',\n provider: 'vimeo',\n })!(state, tr => {\n state = state.apply(tr);\n });\n expect(state.doc.firstChild!.type.name).to.equal('embed');\n });\n});\n\ndescribe('code highlighting', () => {\n it('produces token decorations for code blocks', () => {\n const state = createEditorState({\n doc: htmlToDoc(\n defaultSchema,\n '<pre data-language=\"javascript\"><code>const answer = 42; // why</code></pre>'\n ),\n });\n const set = codeHighlightKey.getState(state)!;\n const decos = set.find();\n expect(decos.length).to.be.greaterThan(2);\n });\n\n it('skips plaintext blocks and updates the language attr', () => {\n let state = createEditorState({\n doc: htmlToDoc(\n defaultSchema,\n '<pre data-language=\"plaintext\"><code>const answer = 42;</code></pre>'\n ),\n });\n expect(codeHighlightKey.getState(state)!.find().length).to.equal(0);\n\n state = state.apply(state.tr.setSelection(TextSelection.near(state.doc.resolve(1))));\n getCommand(state, 'setCodeBlockLanguage', { language: 'javascript' })!(state, tr => {\n state = state.apply(tr);\n });\n expect(state.doc.firstChild!.attrs.language).to.equal('javascript');\n expect(codeHighlightKey.getState(state)!.find().length).to.be.greaterThan(1);\n });\n});\n\ndescribe('phase 4: subscript & superscript', () => {\n it('round-trips sub and sup marks', () => {\n for (const html of ['<p>H<sub>2</sub>O</p>', '<p>x<sup>2</sup></p>']) {\n const doc = htmlToDoc(defaultSchema, html);\n expect(docToHtml(doc)).to.equal(html);\n expect(htmlToDoc(defaultSchema, docToHtml(doc)).eq(doc)).to.equal(true);\n }\n });\n\n it('parses vertical-align styles pasted from Word/Docs', () => {\n expect(\n docToHtml(htmlToDoc(defaultSchema, '<p><span style=\"vertical-align: sub\">2</span></p>'))\n ).to.include('<sub>');\n expect(\n docToHtml(htmlToDoc(defaultSchema, '<p><span style=\"vertical-align: super\">2</span></p>'))\n ).to.include('<sup>');\n });\n\n it('toggles sub/sup and keeps them mutually exclusive', () => {\n let state = stateWithAllSelected('<p>x</p>');\n getCommand(state, 'subscript')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p><sub>x</sub></p>');\n // Applying superscript over a subscript replaces it (excludes).\n getCommand(state, 'superscript')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p><sup>x</sup></p>');\n });\n\n it('reports sub/sup in toolbar state', () => {\n expect(computeToolbarState(stateWithAllSelected('<p><sub>x</sub></p>')).subscript).to.equal(\n true\n );\n expect(\n computeToolbarState(stateWithAllSelected('<p><sup>x</sup></p>')).superscript\n ).to.equal(true);\n });\n});\n\ndescribe('phase 4: paste as plain text', () => {\n it('builds a plain-text slice splitting on newlines', () => {\n const slice = plainTextSlice(defaultSchema, 'line1\\nline2');\n expect(slice.content.childCount).to.equal(2);\n expect(slice.content.firstChild!.textContent).to.equal('line1');\n expect(slice.content.lastChild!.textContent).to.equal('line2');\n });\n\n it('strips marks and block structure from a rich slice', () => {\n const rich = htmlToSlice(defaultSchema, '<h2><strong>bold</strong> head</h2>');\n const plain = stripSliceFormatting(defaultSchema, rich);\n const para = plain.content.firstChild!;\n expect(para.type.name).to.equal('paragraph');\n expect(para.textContent).to.equal('bold head');\n expect(para.firstChild!.marks.length).to.equal(0);\n });\n\n it('only strips when the toggle reads true', () => {\n let force = false;\n const state = createEditorState({ getForcePlainText: () => force });\n const paste = state.plugins\n .map(p => p.props?.transformPasted)\n .find(Boolean) as unknown as (slice: unknown, ...rest: unknown[]) => any;\n const rich = htmlToSlice(defaultSchema, '<p><strong>bold</strong></p>');\n // Off: slice passes through unchanged.\n expect(paste(rich).eq(rich)).to.equal(true);\n // On: formatting is dropped.\n force = true;\n const out = paste(rich);\n expect(out.content.firstChild.firstChild.marks.length).to.equal(0);\n });\n});\n\ndescribe('phase 4: more code languages', () => {\n it('highlights newly registered languages', () => {\n for (const language of ['go', 'rust', 'ruby', 'csharp']) {\n const state = createEditorState({\n doc: htmlToDoc(\n defaultSchema,\n `<pre data-language=\"${language}\"><code>fn main() { let x = 1; }</code></pre>`\n ),\n });\n expect(codeHighlightKey.getState(state)!.find().length, language).to.be.greaterThan(0);\n }\n });\n});\n\ndescribe('phase 4: markdown export', () => {\n const cases: [string, string][] = [\n ['<h2>Title</h2><p>Hello <strong>bold</strong> and <em>it</em></p>', '## Title\\n\\nHello **bold** and *it*\\n'],\n ['<ul><li><p>one</p></li><li><p>two</p></li></ul>', '- one\\n- two\\n'],\n ['<ol><li><p>a</p></li><li><p>b</p></li></ol>', '1. a\\n2. b\\n'],\n ['<blockquote><p>quoted</p></blockquote>', '> quoted\\n'],\n ['<p><a href=\"https://x.dev\">link</a></p>', '[link](https://x.dev)\\n'],\n ['<p><code>x()</code></p>', '`x()`\\n'],\n ['<pre data-language=\"js\"><code>const a = 1;</code></pre>', '```js\\nconst a = 1;\\n```\\n'],\n ['<p><img src=\"https://x.dev/a.png\" alt=\"A\"></p>', '![A](https://x.dev/a.png)\\n'],\n ['<hr>', '---\\n'],\n ['<p>H<sub>2</sub>O and x<sup>2</sup></p>', 'H<sub>2</sub>O and x<sup>2</sup>\\n'],\n ];\n\n for (const [input, expected] of cases) {\n it(`serializes ${input.slice(0, 36)}`, () => {\n expect(docToMarkdown(htmlToDoc(defaultSchema, input))).to.equal(expected);\n });\n }\n\n it('serializes checklists with checked state', () => {\n const html =\n '<ul data-task-list=\"true\"><li data-task-item=\"true\" data-checked=\"true\"><p>done</p></li>' +\n '<li data-task-item=\"true\" data-checked=\"false\"><p>todo</p></li></ul>';\n expect(docToMarkdown(htmlToDoc(defaultSchema, html))).to.equal('- [x] done\\n- [ ] todo\\n');\n });\n\n it('serializes a GitHub-flavored table', () => {\n const html =\n '<table><tbody><tr><th><p>h1</p></th><th><p>h2</p></th></tr>' +\n '<tr><td><p>a</p></td><td><p>b</p></td></tr></tbody></table>';\n expect(docToMarkdown(htmlToDoc(defaultSchema, html))).to.equal(\n '| h1 | h2 |\\n| --- | --- |\\n| a | b |\\n'\n );\n });\n\n it('returns an empty string for an empty document', () => {\n expect(docToMarkdown(htmlToDoc(defaultSchema, '<p></p>'))).to.equal('');\n });\n});\n\ndescribe('computeToolbarState', () => {\n it('reports active marks and block info', () => {\n const state = stateWithAllSelected('<h3><strong>bold heading</strong></h3>');\n const ts = computeToolbarState(state);\n expect(ts.bold).to.equal(true);\n expect(ts.italic).to.equal(false);\n expect(ts.blockType).to.equal('heading');\n expect(ts.headingLevel).to.equal(3);\n });\n\n it('reports list and link context', () => {\n const state = stateWithAllSelected(\n '<ul><li><p><a href=\"https://x.dev\">in list</a></p></li></ul>'\n );\n const ts = computeToolbarState(state);\n expect(ts.inBulletList).to.equal(true);\n expect(ts.linkActive).to.equal(true);\n expect(ts.linkHref).to.equal('https://x.dev');\n });\n\n it('reports block info for a Ctrl+A AllSelection', () => {\n const doc = htmlToDoc(defaultSchema, '<h1>sdasd</h1>');\n const base = createEditorState({ doc });\n const state = base.apply(base.tr.setSelection(new AllSelection(base.doc)));\n const ts = computeToolbarState(state);\n expect(ts.blockType).to.equal('heading');\n expect(ts.headingLevel).to.equal(1);\n });\n});\n\ndescribe('indent & outdent', () => {\n /** Cursor inside the second item of a two-item bullet list. */\n function stateInSecondItem() {\n const doc = htmlToDoc(\n defaultSchema,\n '<ul><li><p>one</p></li><li><p>two</p></li></ul>'\n );\n const state = createEditorState({ doc });\n // Position inside \"two\" (after \"one\" paragraph + item boundaries).\n const pos = state.doc.content.size - 4;\n return state.apply(\n state.tr.setSelection(TextSelection.create(state.doc, pos))\n );\n }\n\n it('indent sinks a list item into the previous one', () => {\n let state = stateInSecondItem();\n const applied = getCommand(state, 'indent')!(state, tr => {\n state = state.apply(tr);\n });\n expect(applied).to.equal(true);\n expect(docToHtml(state.doc)).to.equal(\n '<ul><li><p>one</p><ul><li><p>two</p></li></ul></li></ul>'\n );\n });\n\n it('outdent lifts a nested item back out', () => {\n let state = stateInSecondItem();\n getCommand(state, 'indent')!(state, tr => {\n state = state.apply(tr);\n });\n getCommand(state, 'outdent')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal(\n '<ul><li><p>one</p></li><li><p>two</p></li></ul>'\n );\n });\n\n it('indent adds margin steps to plain paragraphs', () => {\n let state = stateWithAllSelected('<p>text</p>');\n getCommand(state, 'indent')!(state, tr => {\n state = state.apply(tr);\n });\n // Browsers may serialize style attributes with a trailing semicolon.\n expect(docToHtml(state.doc)).to.include('margin-inline-start: 40px');\n getCommand(state, 'indent')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('margin-inline-start: 80px');\n getCommand(state, 'outdent')!(state, tr => {\n state = state.apply(tr);\n });\n getCommand(state, 'outdent')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p>text</p>');\n });\n\n it('outdent at indent 0 outside lists and quotes does nothing', () => {\n let state = stateWithAllSelected('<p>text</p>');\n const applied = getCommand(state, 'outdent')!(state, tr => {\n state = state.apply(tr);\n });\n expect(applied).to.equal(false);\n });\n\n it('outdent lifts a block out of a blockquote', () => {\n let state = stateWithAllSelected('<blockquote><p>quoted</p></blockquote>');\n const applied = getCommand(state, 'outdent')!(state, tr => {\n state = state.apply(tr);\n });\n expect(applied).to.equal(true);\n expect(docToHtml(state.doc)).to.equal('<p>quoted</p>');\n });\n});\n\ndescribe('list properties', () => {\n it('sets and clears bullet marker styles', () => {\n let state = stateWithAllSelected('<ul><li><p>a</p></li></ul>');\n getCommand(state, 'setListStyle', { style: 'square' })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('list-style-type: square');\n getCommand(state, 'setListStyle', { style: null })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<ul><li><p>a</p></li></ul>');\n });\n\n it('sets numbering style as the HTML type attribute', () => {\n let state = stateWithAllSelected('<ol><li><p>a</p></li></ol>');\n getCommand(state, 'setListStyle', { style: 'lower-roman' })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<ol type=\"i\"><li><p>a</p></li></ol>');\n });\n\n it('sets the start number of an ordered list', () => {\n let state = stateWithAllSelected('<ol><li><p>a</p></li></ol>');\n getCommand(state, 'setListStart', { start: 5 })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<ol start=\"5\"><li><p>a</p></li></ol>');\n });\n\n it('round-trips ol type through parsing', () => {\n const doc = htmlToDoc(defaultSchema, '<ol type=\"A\" start=\"3\"><li><p>x</p></li></ol>');\n expect(docToHtml(doc)).to.equal('<ol start=\"3\" type=\"A\"><li><p>x</p></li></ol>');\n });\n});\n\ndescribe('figure & image commands', () => {\n /** State with a NodeSelection on the inline image. */\n function stateWithImageSelected() {\n const doc = htmlToDoc(defaultSchema, '<p><img src=\"https://x.co/i.png\" alt=\"pic\"></p>');\n const state = createEditorState({ doc });\n // Image node position: inside the paragraph at pos 1.\n return state.apply(state.tr.setSelection(NodeSelection.create(state.doc, 1)));\n }\n\n it('parses and serializes a figure with caption', () => {\n const html =\n '<figure><img src=\"https://x.co/i.png\" alt=\"pic\"><figcaption>My caption</figcaption></figure>';\n const doc = htmlToDoc(defaultSchema, html);\n const out = docToHtml(doc);\n expect(out).to.include('<figure');\n expect(out).to.include('src=\"https://x.co/i.png\"');\n expect(out).to.include('<figcaption');\n expect(out).to.include('My caption');\n });\n\n it('parses image width from inline style', () => {\n const doc = htmlToDoc(defaultSchema, '<p><img src=\"https://x.co/i.png\" style=\"width: 240px\"></p>');\n expect(docToHtml(doc)).to.include('width: 240px');\n });\n\n it('toggleImageCaption converts an inline image into a figure', () => {\n let state = stateWithImageSelected();\n const applied = getCommand(state, 'toggleImageCaption')!(state, tr => {\n state = state.apply(tr);\n });\n expect(applied).to.equal(true);\n const out = docToHtml(state.doc);\n expect(out).to.include('<figure');\n expect(out).to.include('pic'); // alt prefills the caption\n });\n\n it('toggleImageCaption converts a figure back to an inline image', () => {\n let state = stateWithAllSelected(\n '<figure><img src=\"https://x.co/i.png\"><figcaption>cap</figcaption></figure>'\n );\n // Cursor is inside the caption — selectedImageInfo resolves the figure.\n const applied = getCommand(state, 'toggleImageCaption')!(state, tr => {\n state = state.apply(tr);\n });\n expect(applied).to.equal(true);\n const out = docToHtml(state.doc);\n expect(out).to.not.include('<figure');\n expect(out).to.include('<img');\n });\n\n it('setImageAlign promotes an inline image to an aligned figure', () => {\n let state = stateWithImageSelected();\n getCommand(state, 'setImageAlign', { align: 'center' })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('data-align=\"center\"');\n });\n\n it('setImageWidth writes the width attr', () => {\n let state = stateWithImageSelected();\n getCommand(state, 'setImageWidth', { width: 320 })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('width: 320px');\n });\n\n it('deleteImage removes the selected image', () => {\n let state = stateWithImageSelected();\n getCommand(state, 'deleteImage')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.not.include('<img');\n });\n});\n\ndescribe('paste from Office', () => {\n it('detects Word and Google Docs clipboard HTML', () => {\n expect(isOfficeHtml('<p class=\"MsoNormal\">x</p>')).to.equal(true);\n expect(isOfficeHtml('<b id=\"docs-internal-guid-abc\"><p>x</p></b>')).to.equal(true);\n expect(isOfficeHtml('<p>plain</p>')).to.equal(false);\n });\n\n it('converts Word list paragraphs into a real bullet list', () => {\n const word =\n '<p class=\"MsoListParagraph\" style=\"mso-list:l0 level1 lfo1\">' +\n '<span style=\"mso-list:Ignore\">·<span>&nbsp;</span></span>Alpha</p>' +\n '<p class=\"MsoListParagraph\" style=\"mso-list:l0 level1 lfo1\">' +\n '<span style=\"mso-list:Ignore\">·<span>&nbsp;</span></span>Beta</p>';\n const out = cleanOfficeHtml(word);\n expect(out).to.include('<ul>');\n expect(out).to.include('Alpha');\n expect(out).to.include('Beta');\n expect(out).to.not.include('mso-list');\n });\n\n it('converts numbered Word paragraphs into an ordered list with nesting', () => {\n const word =\n '<p style=\"mso-list:l0 level1 lfo1\"><span style=\"mso-list:Ignore\">1.</span>One</p>' +\n '<p style=\"mso-list:l0 level2 lfo1\"><span style=\"mso-list:Ignore\">a.</span>Nested</p>' +\n '<p style=\"mso-list:l0 level1 lfo1\"><span style=\"mso-list:Ignore\">2.</span>Two</p>';\n const out = cleanOfficeHtml(word);\n expect(out.indexOf('<ol>')).to.be.greaterThan(-1);\n // Nested list sits inside the first item.\n expect(out.indexOf('Nested')).to.be.greaterThan(out.indexOf('One'));\n expect(out.indexOf('Two')).to.be.greaterThan(out.indexOf('Nested'));\n });\n\n it('unwraps the Google Docs bold guid wrapper', () => {\n const gdocs =\n '<b id=\"docs-internal-guid-x\" style=\"font-weight:normal\"><p>hello</p></b>';\n const out = cleanOfficeHtml(gdocs);\n expect(out).to.equal('<p>hello</p>');\n });\n\n it('drops conditional comments and o:p tags', () => {\n // Downlevel-hidden conditional: the marker content is inside the comment.\n const word = '<p><!--[if !supportLists]>junk<![endif]-->text<o:p></o:p></p>';\n const out = cleanOfficeHtml(word);\n expect(out).to.not.include('junk');\n expect(out).to.include('text');\n });\n});\n\ndescribe('line height', () => {\n it('sets and clears line height on textblocks', () => {\n let state = stateWithAllSelected('<p>hello</p>');\n getCommand(state, 'lineHeight', { lineHeight: '1.5' })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('line-height: 1.5');\n expect(computeToolbarState(state).lineHeight).to.equal('1.5');\n getCommand(state, 'lineHeight', { lineHeight: null })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p>hello</p>');\n });\n\n it('parses line-height styles, converting percentages', () => {\n const doc = htmlToDoc(defaultSchema, '<p style=\"line-height: 150%\">a</p>');\n expect(docToHtml(doc)).to.include('line-height: 1.5');\n });\n\n it('survives the sanitizer', () => {\n expect(sanitizeHtml('<p style=\"line-height: 2\">a</p>')).to.include('line-height: 2');\n });\n\n it('is cleared by clearFormatting', () => {\n let state = stateWithAllSelected('<p style=\"line-height: 2\">hello</p>');\n getCommand(state, 'clearFormatting')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p>hello</p>');\n });\n});\n\ndescribe('bookmarks', () => {\n it('inserts a bookmark anchor at the cursor', () => {\n let state = createEditorState({ doc: htmlToDoc(defaultSchema, '<p>hello</p>') });\n state = state.apply(\n state.tr.setSelection(TextSelection.create(state.doc, 1))\n );\n getCommand(state, 'insertBookmark', { id: 'intro' })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.equal('<p><a id=\"intro\" data-bookmark=\"true\"></a>hello</p>');\n });\n\n it('rejects empty ids', () => {\n const state = createEditorState({ doc: htmlToDoc(defaultSchema, '<p>hello</p>') });\n expect(getCommand(state, 'insertBookmark', { id: ' ' })!(state)).to.equal(false);\n });\n\n it('round-trips id and legacy name anchors, but not links', () => {\n const doc = htmlToDoc(\n defaultSchema,\n '<p><a id=\"one\"></a>x<a name=\"two\"></a>y<a href=\"https://a.b\">link</a></p>'\n );\n const out = docToHtml(doc);\n expect(out).to.include('<a id=\"one\" data-bookmark=\"true\"></a>');\n expect(out).to.include('<a id=\"two\" data-bookmark=\"true\"></a>');\n expect(out).to.include('<a href=\"https://a.b\">link</a>');\n });\n});\n\ndescribe('layout tables', () => {\n const table = '<table><tr><td><p>a</p></td></tr></table>';\n\n function stateInTable(html: string) {\n const doc = htmlToDoc(defaultSchema, html);\n const state = createEditorState({ doc });\n // Place the cursor inside the first cell's paragraph.\n let pos = 0;\n state.doc.descendants((node, p) => {\n if (!pos && node.isTextblock) pos = p + 1;\n return !pos;\n });\n return state.apply(state.tr.setSelection(TextSelection.create(state.doc, pos)));\n }\n\n it('toggles the surrounding table into layout mode and back', () => {\n let state = stateInTable(table);\n getCommand(state, 'toggleLayoutTable')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.include('<table role=\"presentation\" data-layout=\"true\">');\n expect(computeToolbarState(state).tableLayout).to.equal(true);\n getCommand(state, 'toggleLayoutTable')!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.not.include('data-layout');\n });\n\n it('parses role=\"presentation\" tables as layout tables', () => {\n const doc = htmlToDoc(\n defaultSchema,\n '<table role=\"presentation\"><tr><td><p>a</p></td></tr></table>'\n );\n expect(docToHtml(doc)).to.include('role=\"presentation\"');\n });\n\n it('returns false outside a table', () => {\n const state = stateWithAllSelected('<p>hello</p>');\n expect(getCommand(state, 'toggleLayoutTable')!(state)).to.equal(false);\n });\n});\n\ndescribe('multi-level lists', () => {\n const nested =\n '<ol data-list-style=\"multilevel\"><li><p>one</p><ol><li><p>deep</p></li></ol></li></ol>';\n\n it('round-trips the multilevel marker', () => {\n const doc = htmlToDoc(defaultSchema, nested);\n expect(docToHtml(doc)).to.include('data-list-style=\"multilevel\"');\n });\n\n it('survives the sanitizer', () => {\n expect(sanitizeHtml(nested)).to.include('data-list-style=\"multilevel\"');\n });\n\n it('applies multilevel to the outermost ordered list from a nested item', () => {\n const html = '<ol><li><p>one</p><ol><li><p>deep</p></li></ol></li></ol>';\n let state = createEditorState({ doc: htmlToDoc(defaultSchema, html) });\n let pos = 0;\n state.doc.descendants((node, p) => {\n if (node.isTextblock && node.textContent === 'deep') pos = p + 1;\n return pos === 0;\n });\n state = state.apply(state.tr.setSelection(TextSelection.create(state.doc, pos)));\n getCommand(state, 'setListStyle', { style: 'multilevel' })!(state, tr => {\n state = state.apply(tr);\n });\n const out = docToHtml(state.doc);\n // The outer list carries the marker, not the nested one.\n expect(out.startsWith('<ol data-list-style=\"multilevel\">')).to.equal(true);\n expect(out.indexOf('data-list-style')).to.equal(out.lastIndexOf('data-list-style'));\n // The toolbar reports it from the nested cursor, and clearing removes it.\n expect(computeToolbarState(state).listStyle).to.equal('multilevel');\n getCommand(state, 'setListStyle', { style: null })!(state, tr => {\n state = state.apply(tr);\n });\n expect(docToHtml(state.doc)).to.not.include('data-list-style');\n });\n});\n"]}
@@ -6,6 +6,18 @@
6
6
  * set the schema understands.
7
7
  */
8
8
  export declare function isSafeUrl(url: string, allowDataImage?: boolean): boolean;
9
+ /**
10
+ * Sanitizes the CSS inside a <style> block. Neutralizes the vectors that make
11
+ * a raw stylesheet dangerous while leaving ordinary rules intact:
12
+ * - `@import` (external fetch / data exfiltration) — removed,
13
+ * - `expression()`, `behavior:`, `-moz-binding:` (script execution) — broken,
14
+ * - `url(...)` pointing anywhere other than a safe data: image or a local
15
+ * `#fragment` — replaced with `url(#)`,
16
+ * - any `</style` sequence — stripped so the text can't break out of the
17
+ * element when the document is re-serialized.
18
+ * CSS comments are dropped first so none of the above can hide inside one.
19
+ */
20
+ export declare function sanitizeCss(css: string): string;
9
21
  /**
10
22
  * Sanitizes an HTML string. Parsing happens in an inert document created by
11
23
  * DOMParser, so embedded scripts never execute and images never load.