@aquera/nile-elements 1.9.6 → 1.9.7

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 (510) hide show
  1. package/README.md +3 -0
  2. package/dist/index-178e1e57.cjs.js +2 -0
  3. package/dist/index-178e1e57.cjs.js.map +1 -0
  4. package/dist/index-1faa963c.esm.js +1 -0
  5. package/dist/index-249de90a.esm.js +1 -0
  6. package/dist/index-353172ed.esm.js +1 -0
  7. package/dist/index-6f3fa4ab.esm.js +1 -0
  8. package/dist/index-89c520e9.cjs.js +5 -0
  9. package/dist/index-89c520e9.cjs.js.map +1 -0
  10. package/dist/index-920675c4.esm.js +1 -0
  11. package/dist/index-b387a9f4.cjs.js +2 -0
  12. package/dist/index-b387a9f4.cjs.js.map +1 -0
  13. package/dist/index-cc1385e0.cjs.js +2 -0
  14. package/dist/index-cc1385e0.cjs.js.map +1 -0
  15. package/dist/index-dedc38a6.esm.js +1 -0
  16. package/dist/index-df196058.cjs.js +2 -0
  17. package/dist/index-df196058.cjs.js.map +1 -0
  18. package/dist/index-f956f56d.cjs.js +7 -0
  19. package/dist/index-f956f56d.cjs.js.map +1 -0
  20. package/dist/index.cjs.js +1 -1
  21. package/dist/index.esm.js +1 -1
  22. package/dist/index.js +3595 -629
  23. package/dist/internal/glyph.cjs.js +2 -0
  24. package/dist/internal/glyph.cjs.js.map +1 -0
  25. package/dist/internal/glyph.esm.js +5 -0
  26. package/dist/nile-auto-complete/index.cjs.js +1 -1
  27. package/dist/nile-auto-complete/nile-auto-complete.cjs.js +1 -1
  28. package/dist/nile-auto-complete/portal-manager.cjs.js +1 -1
  29. package/dist/nile-auto-complete/portal-utils.cjs.js +1 -1
  30. package/dist/nile-code-editor/extensionSetup.cjs.js +7 -7
  31. package/dist/nile-code-editor/extensionSetup.cjs.js.map +1 -1
  32. package/dist/nile-code-editor/extensionSetup.esm.js +1 -1
  33. package/dist/nile-code-editor/index.cjs.js +1 -1
  34. package/dist/nile-code-editor/index.esm.js +1 -1
  35. package/dist/nile-code-editor/nile-code-editor.cjs.js +2 -2
  36. package/dist/nile-code-editor/nile-code-editor.cjs.js.map +1 -1
  37. package/dist/nile-code-editor/nile-code-editor.esm.js +1 -1
  38. package/dist/nile-color-picker/index.cjs.js +1 -1
  39. package/dist/nile-color-picker/nile-color-picker.cjs.js +1 -1
  40. package/dist/nile-combobox/index.cjs.js +1 -1
  41. package/dist/nile-combobox/index.esm.js +1 -1
  42. package/dist/nile-combobox/nile-combobox.cjs.js +1 -1
  43. package/dist/nile-combobox/nile-combobox.esm.js +1 -1
  44. package/dist/nile-combobox/portal-manager.cjs.js +1 -1
  45. package/dist/nile-context-menu/index.cjs.js +1 -1
  46. package/dist/nile-context-menu/nile-context-menu.cjs.js +1 -1
  47. package/dist/nile-context-submenu/index.cjs.js +1 -1
  48. package/dist/nile-context-submenu/nile-context-submenu.cjs.js +1 -1
  49. package/dist/nile-detail/index.cjs.js +1 -1
  50. package/dist/nile-detail/index.esm.js +1 -1
  51. package/dist/nile-detail/nile-detail.cjs.js +1 -1
  52. package/dist/nile-detail/nile-detail.esm.js +1 -1
  53. package/dist/nile-dropdown/index.cjs.js +1 -1
  54. package/dist/nile-dropdown/nile-dropdown.cjs.js +1 -1
  55. package/dist/nile-dropdown/portal-manager.cjs.js +1 -1
  56. package/dist/nile-file-upload/index.cjs.js +1 -1
  57. package/dist/nile-file-upload/nile-file-upload.cjs.js +1 -1
  58. package/dist/nile-file-upload/nile-file-upload.template.cjs.js +1 -1
  59. package/dist/nile-floating-panel/index.cjs.js +1 -1
  60. package/dist/nile-floating-panel/nile-floating-panel.cjs.js +1 -1
  61. package/dist/nile-lite-tooltip/index.cjs.js +1 -1
  62. package/dist/nile-lite-tooltip/nile-lite-tooltip.cjs.js +1 -1
  63. package/dist/nile-markdown-editor/index.cjs.js +1 -1
  64. package/dist/nile-markdown-editor/nile-markdown-editor.cjs.js +1 -1
  65. package/dist/nile-popover/index.cjs.js +1 -1
  66. package/dist/nile-popover/nile-popover.cjs.js +1 -1
  67. package/dist/nile-popover/portal-manager.cjs.js +1 -1
  68. package/dist/nile-popup/index.cjs.js +1 -1
  69. package/dist/nile-popup/nile-popup.cjs.js +1 -1
  70. package/dist/nile-select/index.cjs.js +1 -1
  71. package/dist/nile-select/nile-select.cjs.js +1 -1
  72. package/dist/nile-select/portal-manager.cjs.js +1 -1
  73. package/dist/nile-side-bar-action/index.cjs.js +1 -1
  74. package/dist/nile-side-bar-action/nile-side-bar-action.cjs.js +1 -1
  75. package/dist/nile-side-bar-action/portal-manager.cjs.js +1 -1
  76. package/dist/nile-tooltip/index.cjs.js +1 -1
  77. package/dist/nile-tooltip/nile-tooltip.cjs.js +1 -1
  78. package/dist/nile-virtual-select/index.cjs.js +1 -1
  79. package/dist/nile-virtual-select/nile-virtual-select.cjs.js +1 -1
  80. package/dist/nile-virtual-select/portal-manager.cjs.js +1 -1
  81. package/dist/nile-virtual-select/renderer.cjs.js +1 -1
  82. package/dist/nile-wysiwyg-editor/emoji.cjs.js +2 -0
  83. package/dist/nile-wysiwyg-editor/emoji.cjs.js.map +1 -0
  84. package/dist/nile-wysiwyg-editor/emoji.esm.js +1 -0
  85. package/dist/nile-wysiwyg-editor/engine/commands.cjs.js +2 -0
  86. package/dist/nile-wysiwyg-editor/engine/commands.cjs.js.map +1 -0
  87. package/dist/nile-wysiwyg-editor/engine/commands.esm.js +1 -0
  88. package/dist/nile-wysiwyg-editor/engine/create-state.cjs.js +2 -0
  89. package/dist/nile-wysiwyg-editor/engine/create-state.cjs.js.map +1 -0
  90. package/dist/nile-wysiwyg-editor/engine/create-state.esm.js +1 -0
  91. package/dist/nile-wysiwyg-editor/engine/export.cjs.js +2 -0
  92. package/dist/nile-wysiwyg-editor/engine/export.cjs.js.map +1 -0
  93. package/dist/nile-wysiwyg-editor/engine/export.esm.js +1 -0
  94. package/dist/nile-wysiwyg-editor/engine/index.cjs.js +2 -0
  95. package/dist/nile-wysiwyg-editor/engine/index.cjs.js.map +1 -0
  96. package/dist/nile-wysiwyg-editor/engine/index.esm.js +1 -0
  97. package/dist/nile-wysiwyg-editor/engine/inputrules.cjs.js +2 -0
  98. package/dist/nile-wysiwyg-editor/engine/inputrules.cjs.js.map +1 -0
  99. package/dist/nile-wysiwyg-editor/engine/inputrules.esm.js +1 -0
  100. package/dist/nile-wysiwyg-editor/engine/keymap.cjs.js +2 -0
  101. package/dist/nile-wysiwyg-editor/engine/keymap.cjs.js.map +1 -0
  102. package/dist/nile-wysiwyg-editor/engine/keymap.esm.js +1 -0
  103. package/dist/nile-wysiwyg-editor/engine/markdown-parse.cjs.js +2 -0
  104. package/dist/nile-wysiwyg-editor/engine/markdown-parse.cjs.js.map +1 -0
  105. package/dist/nile-wysiwyg-editor/engine/markdown-parse.esm.js +1 -0
  106. package/dist/nile-wysiwyg-editor/engine/markdown.cjs.js +2 -0
  107. package/dist/nile-wysiwyg-editor/engine/markdown.cjs.js.map +1 -0
  108. package/dist/nile-wysiwyg-editor/engine/markdown.esm.js +1 -0
  109. package/dist/nile-wysiwyg-editor/engine/office-paste.cjs.js +2 -0
  110. package/dist/nile-wysiwyg-editor/engine/office-paste.cjs.js.map +1 -0
  111. package/dist/nile-wysiwyg-editor/engine/office-paste.esm.js +1 -0
  112. package/dist/nile-wysiwyg-editor/engine/plugins/code-highlight.cjs.js +2 -0
  113. package/dist/nile-wysiwyg-editor/engine/plugins/code-highlight.cjs.js.map +1 -0
  114. package/dist/nile-wysiwyg-editor/engine/plugins/code-highlight.esm.js +1 -0
  115. package/dist/nile-wysiwyg-editor/engine/plugins/embed-view.cjs.js +2 -0
  116. package/dist/nile-wysiwyg-editor/engine/plugins/embed-view.cjs.js.map +1 -0
  117. package/dist/nile-wysiwyg-editor/engine/plugins/embed-view.esm.js +1 -0
  118. package/dist/nile-wysiwyg-editor/engine/plugins/embeds.cjs.js +2 -0
  119. package/dist/nile-wysiwyg-editor/engine/plugins/embeds.cjs.js.map +1 -0
  120. package/dist/nile-wysiwyg-editor/engine/plugins/embeds.esm.js +1 -0
  121. package/dist/nile-wysiwyg-editor/engine/plugins/find-replace.cjs.js +2 -0
  122. package/dist/nile-wysiwyg-editor/engine/plugins/find-replace.cjs.js.map +1 -0
  123. package/dist/nile-wysiwyg-editor/engine/plugins/find-replace.esm.js +1 -0
  124. package/dist/nile-wysiwyg-editor/engine/plugins/format-painter.cjs.js +2 -0
  125. package/dist/nile-wysiwyg-editor/engine/plugins/format-painter.cjs.js.map +1 -0
  126. package/dist/nile-wysiwyg-editor/engine/plugins/format-painter.esm.js +1 -0
  127. package/dist/nile-wysiwyg-editor/engine/plugins/image-view.cjs.js +2 -0
  128. package/dist/nile-wysiwyg-editor/engine/plugins/image-view.cjs.js.map +1 -0
  129. package/dist/nile-wysiwyg-editor/engine/plugins/image-view.esm.js +1 -0
  130. package/dist/nile-wysiwyg-editor/engine/plugins/image.cjs.js +2 -0
  131. package/dist/nile-wysiwyg-editor/engine/plugins/image.cjs.js.map +1 -0
  132. package/dist/nile-wysiwyg-editor/engine/plugins/image.esm.js +1 -0
  133. package/dist/nile-wysiwyg-editor/engine/plugins/link.cjs.js +2 -0
  134. package/dist/nile-wysiwyg-editor/engine/plugins/link.cjs.js.map +1 -0
  135. package/dist/nile-wysiwyg-editor/engine/plugins/link.esm.js +1 -0
  136. package/dist/nile-wysiwyg-editor/engine/plugins/math-view.cjs.js +2 -0
  137. package/dist/nile-wysiwyg-editor/engine/plugins/math-view.cjs.js.map +1 -0
  138. package/dist/nile-wysiwyg-editor/engine/plugins/math-view.esm.js +1 -0
  139. package/dist/nile-wysiwyg-editor/engine/plugins/max-length.cjs.js +2 -0
  140. package/dist/nile-wysiwyg-editor/engine/plugins/max-length.cjs.js.map +1 -0
  141. package/dist/nile-wysiwyg-editor/engine/plugins/max-length.esm.js +1 -0
  142. package/dist/nile-wysiwyg-editor/engine/plugins/paste.cjs.js +2 -0
  143. package/dist/nile-wysiwyg-editor/engine/plugins/paste.cjs.js.map +1 -0
  144. package/dist/nile-wysiwyg-editor/engine/plugins/paste.esm.js +1 -0
  145. package/dist/nile-wysiwyg-editor/engine/plugins/placeholder.cjs.js +2 -0
  146. package/dist/nile-wysiwyg-editor/engine/plugins/placeholder.cjs.js.map +1 -0
  147. package/dist/nile-wysiwyg-editor/engine/plugins/placeholder.esm.js +1 -0
  148. package/dist/nile-wysiwyg-editor/engine/plugins/single-line.cjs.js +2 -0
  149. package/dist/nile-wysiwyg-editor/engine/plugins/single-line.cjs.js.map +1 -0
  150. package/dist/nile-wysiwyg-editor/engine/plugins/single-line.esm.js +1 -0
  151. package/dist/nile-wysiwyg-editor/engine/plugins/suggestions.cjs.js +2 -0
  152. package/dist/nile-wysiwyg-editor/engine/plugins/suggestions.cjs.js.map +1 -0
  153. package/dist/nile-wysiwyg-editor/engine/plugins/suggestions.esm.js +1 -0
  154. package/dist/nile-wysiwyg-editor/engine/plugins/tables.cjs.js +2 -0
  155. package/dist/nile-wysiwyg-editor/engine/plugins/tables.cjs.js.map +1 -0
  156. package/dist/nile-wysiwyg-editor/engine/plugins/tables.esm.js +1 -0
  157. package/dist/nile-wysiwyg-editor/engine/plugins/task-list.cjs.js +2 -0
  158. package/dist/nile-wysiwyg-editor/engine/plugins/task-list.cjs.js.map +1 -0
  159. package/dist/nile-wysiwyg-editor/engine/plugins/task-list.esm.js +1 -0
  160. package/dist/nile-wysiwyg-editor/engine/sanitize.cjs.js +2 -0
  161. package/dist/nile-wysiwyg-editor/engine/sanitize.cjs.js.map +1 -0
  162. package/dist/nile-wysiwyg-editor/engine/sanitize.esm.js +1 -0
  163. package/dist/nile-wysiwyg-editor/engine/schema.cjs.js +2 -0
  164. package/dist/nile-wysiwyg-editor/engine/schema.cjs.js.map +1 -0
  165. package/dist/nile-wysiwyg-editor/engine/schema.esm.js +1 -0
  166. package/dist/nile-wysiwyg-editor/engine/selection-state.cjs.js +2 -0
  167. package/dist/nile-wysiwyg-editor/engine/selection-state.cjs.js.map +1 -0
  168. package/dist/nile-wysiwyg-editor/engine/selection-state.esm.js +1 -0
  169. package/dist/nile-wysiwyg-editor/engine/serializer.cjs.js +2 -0
  170. package/dist/nile-wysiwyg-editor/engine/serializer.cjs.js.map +1 -0
  171. package/dist/nile-wysiwyg-editor/engine/serializer.esm.js +1 -0
  172. package/dist/nile-wysiwyg-editor/index.cjs.js +2 -0
  173. package/dist/nile-wysiwyg-editor/index.cjs.js.map +1 -0
  174. package/dist/nile-wysiwyg-editor/index.esm.js +1 -0
  175. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.cjs.js +2 -0
  176. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.cjs.js.map +1 -0
  177. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.css.cjs.js +2 -0
  178. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.css.cjs.js.map +1 -0
  179. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.css.esm.js +780 -0
  180. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.esm.js +97 -0
  181. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.cjs.js +2 -0
  182. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.cjs.js.map +1 -0
  183. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.esm.js +1 -0
  184. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.cjs.js +2 -0
  185. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.cjs.js.map +1 -0
  186. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.cjs.js +2 -0
  187. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.cjs.js.map +1 -0
  188. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.esm.js +244 -0
  189. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.esm.js +137 -0
  190. package/dist/nile-wysiwyg-editor/types.cjs.js +2 -0
  191. package/dist/nile-wysiwyg-editor/types.cjs.js.map +1 -0
  192. package/dist/nile-wysiwyg-editor/types.esm.js +1 -0
  193. package/dist/nile-wysiwyg-editor/ui/bookmark-panel.cjs.js +2 -0
  194. package/dist/nile-wysiwyg-editor/ui/bookmark-panel.cjs.js.map +1 -0
  195. package/dist/nile-wysiwyg-editor/ui/bookmark-panel.esm.js +97 -0
  196. package/dist/nile-wysiwyg-editor/ui/bubble-menu.cjs.js +2 -0
  197. package/dist/nile-wysiwyg-editor/ui/bubble-menu.cjs.js.map +1 -0
  198. package/dist/nile-wysiwyg-editor/ui/bubble-menu.esm.js +67 -0
  199. package/dist/nile-wysiwyg-editor/ui/code-block-menu.cjs.js +2 -0
  200. package/dist/nile-wysiwyg-editor/ui/code-block-menu.cjs.js.map +1 -0
  201. package/dist/nile-wysiwyg-editor/ui/code-block-menu.esm.js +65 -0
  202. package/dist/nile-wysiwyg-editor/ui/embed-menu.cjs.js +2 -0
  203. package/dist/nile-wysiwyg-editor/ui/embed-menu.cjs.js.map +1 -0
  204. package/dist/nile-wysiwyg-editor/ui/embed-menu.esm.js +64 -0
  205. package/dist/nile-wysiwyg-editor/ui/embed-panel.cjs.js +2 -0
  206. package/dist/nile-wysiwyg-editor/ui/embed-panel.cjs.js.map +1 -0
  207. package/dist/nile-wysiwyg-editor/ui/embed-panel.esm.js +68 -0
  208. package/dist/nile-wysiwyg-editor/ui/emoji-picker.cjs.js +2 -0
  209. package/dist/nile-wysiwyg-editor/ui/emoji-picker.cjs.js.map +1 -0
  210. package/dist/nile-wysiwyg-editor/ui/emoji-picker.esm.js +96 -0
  211. package/dist/nile-wysiwyg-editor/ui/find-replace.cjs.js +2 -0
  212. package/dist/nile-wysiwyg-editor/ui/find-replace.cjs.js.map +1 -0
  213. package/dist/nile-wysiwyg-editor/ui/find-replace.esm.js +112 -0
  214. package/dist/nile-wysiwyg-editor/ui/image-menu.cjs.js +2 -0
  215. package/dist/nile-wysiwyg-editor/ui/image-menu.cjs.js.map +1 -0
  216. package/dist/nile-wysiwyg-editor/ui/image-menu.esm.js +64 -0
  217. package/dist/nile-wysiwyg-editor/ui/image-panel.cjs.js +2 -0
  218. package/dist/nile-wysiwyg-editor/ui/image-panel.cjs.js.map +1 -0
  219. package/dist/nile-wysiwyg-editor/ui/image-panel.esm.js +171 -0
  220. package/dist/nile-wysiwyg-editor/ui/insert-menu.cjs.js +2 -0
  221. package/dist/nile-wysiwyg-editor/ui/insert-menu.cjs.js.map +1 -0
  222. package/dist/nile-wysiwyg-editor/ui/insert-menu.esm.js +90 -0
  223. package/dist/nile-wysiwyg-editor/ui/link-editor.cjs.js +2 -0
  224. package/dist/nile-wysiwyg-editor/ui/link-editor.cjs.js.map +1 -0
  225. package/dist/nile-wysiwyg-editor/ui/link-editor.esm.js +114 -0
  226. package/dist/nile-wysiwyg-editor/ui/markdown-panel.cjs.js +2 -0
  227. package/dist/nile-wysiwyg-editor/ui/markdown-panel.cjs.js.map +1 -0
  228. package/dist/nile-wysiwyg-editor/ui/markdown-panel.esm.js +80 -0
  229. package/dist/nile-wysiwyg-editor/ui/math-panel.cjs.js +2 -0
  230. package/dist/nile-wysiwyg-editor/ui/math-panel.cjs.js.map +1 -0
  231. package/dist/nile-wysiwyg-editor/ui/math-panel.esm.js +92 -0
  232. package/dist/nile-wysiwyg-editor/ui/shortcut-help.cjs.js +2 -0
  233. package/dist/nile-wysiwyg-editor/ui/shortcut-help.cjs.js.map +1 -0
  234. package/dist/nile-wysiwyg-editor/ui/shortcut-help.esm.js +147 -0
  235. package/dist/nile-wysiwyg-editor/ui/source-view.cjs.js +2 -0
  236. package/dist/nile-wysiwyg-editor/ui/source-view.cjs.js.map +1 -0
  237. package/dist/nile-wysiwyg-editor/ui/source-view.esm.js +79 -0
  238. package/dist/nile-wysiwyg-editor/ui/special-chars.cjs.js +2 -0
  239. package/dist/nile-wysiwyg-editor/ui/special-chars.cjs.js.map +1 -0
  240. package/dist/nile-wysiwyg-editor/ui/special-chars.esm.js +96 -0
  241. package/dist/nile-wysiwyg-editor/ui/suggest-list.cjs.js +2 -0
  242. package/dist/nile-wysiwyg-editor/ui/suggest-list.cjs.js.map +1 -0
  243. package/dist/nile-wysiwyg-editor/ui/suggest-list.esm.js +67 -0
  244. package/dist/nile-wysiwyg-editor/ui/table-grid-picker.cjs.js +2 -0
  245. package/dist/nile-wysiwyg-editor/ui/table-grid-picker.cjs.js.map +1 -0
  246. package/dist/nile-wysiwyg-editor/ui/table-grid-picker.esm.js +100 -0
  247. package/dist/nile-wysiwyg-editor/ui/table-menu.cjs.js +2 -0
  248. package/dist/nile-wysiwyg-editor/ui/table-menu.cjs.js.map +1 -0
  249. package/dist/nile-wysiwyg-editor/ui/table-menu.esm.js +58 -0
  250. package/dist/src/index.d.ts +24 -0
  251. package/dist/src/index.js +19 -0
  252. package/dist/src/index.js.map +1 -1
  253. package/dist/src/internal/glyph.d.ts +6 -0
  254. package/dist/src/internal/glyph.js +13 -0
  255. package/dist/src/internal/glyph.js.map +1 -0
  256. package/dist/src/nile-wysiwyg-editor/emoji.d.ts +5 -0
  257. package/dist/src/nile-wysiwyg-editor/emoji.js +138 -0
  258. package/dist/src/nile-wysiwyg-editor/emoji.js.map +1 -0
  259. package/dist/src/nile-wysiwyg-editor/engine/commands.d.ts +69 -0
  260. package/dist/src/nile-wysiwyg-editor/engine/commands.js +863 -0
  261. package/dist/src/nile-wysiwyg-editor/engine/commands.js.map +1 -0
  262. package/dist/src/nile-wysiwyg-editor/engine/create-state.d.ts +35 -0
  263. package/dist/src/nile-wysiwyg-editor/engine/create-state.js +67 -0
  264. package/dist/src/nile-wysiwyg-editor/engine/create-state.js.map +1 -0
  265. package/dist/src/nile-wysiwyg-editor/engine/export.d.ts +38 -0
  266. package/dist/src/nile-wysiwyg-editor/engine/export.js +208 -0
  267. package/dist/src/nile-wysiwyg-editor/engine/export.js.map +1 -0
  268. package/dist/src/nile-wysiwyg-editor/engine/export.test.d.ts +1 -0
  269. package/dist/src/nile-wysiwyg-editor/engine/export.test.js +96 -0
  270. package/dist/src/nile-wysiwyg-editor/engine/export.test.js.map +1 -0
  271. package/dist/src/nile-wysiwyg-editor/engine/index.d.ts +37 -0
  272. package/dist/src/nile-wysiwyg-editor/engine/index.js +29 -0
  273. package/dist/src/nile-wysiwyg-editor/engine/index.js.map +1 -0
  274. package/dist/src/nile-wysiwyg-editor/engine/inputrules.d.ts +12 -0
  275. package/dist/src/nile-wysiwyg-editor/engine/inputrules.js +144 -0
  276. package/dist/src/nile-wysiwyg-editor/engine/inputrules.js.map +1 -0
  277. package/dist/src/nile-wysiwyg-editor/engine/keymap.d.ts +15 -0
  278. package/dist/src/nile-wysiwyg-editor/engine/keymap.js +94 -0
  279. package/dist/src/nile-wysiwyg-editor/engine/keymap.js.map +1 -0
  280. package/dist/src/nile-wysiwyg-editor/engine/markdown-parse.d.ts +22 -0
  281. package/dist/src/nile-wysiwyg-editor/engine/markdown-parse.js +287 -0
  282. package/dist/src/nile-wysiwyg-editor/engine/markdown-parse.js.map +1 -0
  283. package/dist/src/nile-wysiwyg-editor/engine/markdown-parse.test.d.ts +1 -0
  284. package/dist/src/nile-wysiwyg-editor/engine/markdown-parse.test.js +106 -0
  285. package/dist/src/nile-wysiwyg-editor/engine/markdown-parse.test.js.map +1 -0
  286. package/dist/src/nile-wysiwyg-editor/engine/markdown.d.ts +10 -0
  287. package/dist/src/nile-wysiwyg-editor/engine/markdown.js +162 -0
  288. package/dist/src/nile-wysiwyg-editor/engine/markdown.js.map +1 -0
  289. package/dist/src/nile-wysiwyg-editor/engine/office-paste.d.ts +13 -0
  290. package/dist/src/nile-wysiwyg-editor/engine/office-paste.js +182 -0
  291. package/dist/src/nile-wysiwyg-editor/engine/office-paste.js.map +1 -0
  292. package/dist/src/nile-wysiwyg-editor/engine/plugins/code-highlight.d.ts +10 -0
  293. package/dist/src/nile-wysiwyg-editor/engine/plugins/code-highlight.js +165 -0
  294. package/dist/src/nile-wysiwyg-editor/engine/plugins/code-highlight.js.map +1 -0
  295. package/dist/src/nile-wysiwyg-editor/engine/plugins/embed-view.d.ts +17 -0
  296. package/dist/src/nile-wysiwyg-editor/engine/plugins/embed-view.js +69 -0
  297. package/dist/src/nile-wysiwyg-editor/engine/plugins/embed-view.js.map +1 -0
  298. package/dist/src/nile-wysiwyg-editor/engine/plugins/embeds.d.ts +17 -0
  299. package/dist/src/nile-wysiwyg-editor/engine/plugins/embeds.js +96 -0
  300. package/dist/src/nile-wysiwyg-editor/engine/plugins/embeds.js.map +1 -0
  301. package/dist/src/nile-wysiwyg-editor/engine/plugins/find-replace.d.ts +26 -0
  302. package/dist/src/nile-wysiwyg-editor/engine/plugins/find-replace.js +123 -0
  303. package/dist/src/nile-wysiwyg-editor/engine/plugins/find-replace.js.map +1 -0
  304. package/dist/src/nile-wysiwyg-editor/engine/plugins/format-painter.d.ts +28 -0
  305. package/dist/src/nile-wysiwyg-editor/engine/plugins/format-painter.js +72 -0
  306. package/dist/src/nile-wysiwyg-editor/engine/plugins/format-painter.js.map +1 -0
  307. package/dist/src/nile-wysiwyg-editor/engine/plugins/image-view.d.ts +41 -0
  308. package/dist/src/nile-wysiwyg-editor/engine/plugins/image-view.js +176 -0
  309. package/dist/src/nile-wysiwyg-editor/engine/plugins/image-view.js.map +1 -0
  310. package/dist/src/nile-wysiwyg-editor/engine/plugins/image.d.ts +15 -0
  311. package/dist/src/nile-wysiwyg-editor/engine/plugins/image.js +64 -0
  312. package/dist/src/nile-wysiwyg-editor/engine/plugins/image.js.map +1 -0
  313. package/dist/src/nile-wysiwyg-editor/engine/plugins/link.d.ts +11 -0
  314. package/dist/src/nile-wysiwyg-editor/engine/plugins/link.js +42 -0
  315. package/dist/src/nile-wysiwyg-editor/engine/plugins/link.js.map +1 -0
  316. package/dist/src/nile-wysiwyg-editor/engine/plugins/math-view.d.ts +18 -0
  317. package/dist/src/nile-wysiwyg-editor/engine/plugins/math-view.js +46 -0
  318. package/dist/src/nile-wysiwyg-editor/engine/plugins/math-view.js.map +1 -0
  319. package/dist/src/nile-wysiwyg-editor/engine/plugins/max-length.d.ts +7 -0
  320. package/dist/src/nile-wysiwyg-editor/engine/plugins/max-length.js +26 -0
  321. package/dist/src/nile-wysiwyg-editor/engine/plugins/max-length.js.map +1 -0
  322. package/dist/src/nile-wysiwyg-editor/engine/plugins/paste.d.ts +31 -0
  323. package/dist/src/nile-wysiwyg-editor/engine/plugins/paste.js +55 -0
  324. package/dist/src/nile-wysiwyg-editor/engine/plugins/paste.js.map +1 -0
  325. package/dist/src/nile-wysiwyg-editor/engine/plugins/placeholder.d.ts +7 -0
  326. package/dist/src/nile-wysiwyg-editor/engine/plugins/placeholder.js +25 -0
  327. package/dist/src/nile-wysiwyg-editor/engine/plugins/placeholder.js.map +1 -0
  328. package/dist/src/nile-wysiwyg-editor/engine/plugins/single-line.d.ts +10 -0
  329. package/dist/src/nile-wysiwyg-editor/engine/plugins/single-line.js +48 -0
  330. package/dist/src/nile-wysiwyg-editor/engine/plugins/single-line.js.map +1 -0
  331. package/dist/src/nile-wysiwyg-editor/engine/plugins/suggestions.d.ts +29 -0
  332. package/dist/src/nile-wysiwyg-editor/engine/plugins/suggestions.js +87 -0
  333. package/dist/src/nile-wysiwyg-editor/engine/plugins/suggestions.js.map +1 -0
  334. package/dist/src/nile-wysiwyg-editor/engine/plugins/tables.d.ts +8 -0
  335. package/dist/src/nile-wysiwyg-editor/engine/plugins/tables.js +11 -0
  336. package/dist/src/nile-wysiwyg-editor/engine/plugins/tables.js.map +1 -0
  337. package/dist/src/nile-wysiwyg-editor/engine/plugins/task-list.d.ts +16 -0
  338. package/dist/src/nile-wysiwyg-editor/engine/plugins/task-list.js +49 -0
  339. package/dist/src/nile-wysiwyg-editor/engine/plugins/task-list.js.map +1 -0
  340. package/dist/src/nile-wysiwyg-editor/engine/pm.test.d.ts +1 -0
  341. package/dist/src/nile-wysiwyg-editor/engine/pm.test.js +883 -0
  342. package/dist/src/nile-wysiwyg-editor/engine/pm.test.js.map +1 -0
  343. package/dist/src/nile-wysiwyg-editor/engine/productivity.test.d.ts +1 -0
  344. package/dist/src/nile-wysiwyg-editor/engine/productivity.test.js +129 -0
  345. package/dist/src/nile-wysiwyg-editor/engine/productivity.test.js.map +1 -0
  346. package/dist/src/nile-wysiwyg-editor/engine/sanitize.d.ts +13 -0
  347. package/dist/src/nile-wysiwyg-editor/engine/sanitize.js +155 -0
  348. package/dist/src/nile-wysiwyg-editor/engine/sanitize.js.map +1 -0
  349. package/dist/src/nile-wysiwyg-editor/engine/schema.d.ts +20 -0
  350. package/dist/src/nile-wysiwyg-editor/engine/schema.js +823 -0
  351. package/dist/src/nile-wysiwyg-editor/engine/schema.js.map +1 -0
  352. package/dist/src/nile-wysiwyg-editor/engine/selection-state.d.ts +70 -0
  353. package/dist/src/nile-wysiwyg-editor/engine/selection-state.js +138 -0
  354. package/dist/src/nile-wysiwyg-editor/engine/selection-state.js.map +1 -0
  355. package/dist/src/nile-wysiwyg-editor/engine/serializer.d.ts +18 -0
  356. package/dist/src/nile-wysiwyg-editor/engine/serializer.js +63 -0
  357. package/dist/src/nile-wysiwyg-editor/engine/serializer.js.map +1 -0
  358. package/dist/src/nile-wysiwyg-editor/index.d.ts +3 -0
  359. package/dist/src/nile-wysiwyg-editor/index.js +3 -0
  360. package/dist/src/nile-wysiwyg-editor/index.js.map +1 -0
  361. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.css.d.ts +1 -0
  362. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.css.js +782 -0
  363. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.css.js.map +1 -0
  364. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.d.ts +364 -0
  365. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.js +2038 -0
  366. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.js.map +1 -0
  367. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.test.d.ts +1 -0
  368. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.test.js +636 -0
  369. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.test.js.map +1 -0
  370. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.d.ts +1 -0
  371. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.js +2 -0
  372. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.js.map +1 -0
  373. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.d.ts +6 -0
  374. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.js +251 -0
  375. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.js.map +1 -0
  376. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.d.ts +41 -0
  377. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.js +700 -0
  378. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.js.map +1 -0
  379. package/dist/src/nile-wysiwyg-editor/types.d.ts +49 -0
  380. package/dist/src/nile-wysiwyg-editor/types.js +8 -0
  381. package/dist/src/nile-wysiwyg-editor/types.js.map +1 -0
  382. package/dist/src/nile-wysiwyg-editor/ui/bookmark-panel.d.ts +20 -0
  383. package/dist/src/nile-wysiwyg-editor/ui/bookmark-panel.js +159 -0
  384. package/dist/src/nile-wysiwyg-editor/ui/bookmark-panel.js.map +1 -0
  385. package/dist/src/nile-wysiwyg-editor/ui/bubble-menu.d.ts +21 -0
  386. package/dist/src/nile-wysiwyg-editor/ui/bubble-menu.js +125 -0
  387. package/dist/src/nile-wysiwyg-editor/ui/bubble-menu.js.map +1 -0
  388. package/dist/src/nile-wysiwyg-editor/ui/code-block-menu.d.ts +18 -0
  389. package/dist/src/nile-wysiwyg-editor/ui/code-block-menu.js +107 -0
  390. package/dist/src/nile-wysiwyg-editor/ui/code-block-menu.js.map +1 -0
  391. package/dist/src/nile-wysiwyg-editor/ui/embed-menu.d.ts +19 -0
  392. package/dist/src/nile-wysiwyg-editor/ui/embed-menu.js +123 -0
  393. package/dist/src/nile-wysiwyg-editor/ui/embed-menu.js.map +1 -0
  394. package/dist/src/nile-wysiwyg-editor/ui/embed-panel.d.ts +27 -0
  395. package/dist/src/nile-wysiwyg-editor/ui/embed-panel.js +146 -0
  396. package/dist/src/nile-wysiwyg-editor/ui/embed-panel.js.map +1 -0
  397. package/dist/src/nile-wysiwyg-editor/ui/emoji-picker.d.ts +21 -0
  398. package/dist/src/nile-wysiwyg-editor/ui/emoji-picker.js +154 -0
  399. package/dist/src/nile-wysiwyg-editor/ui/emoji-picker.js.map +1 -0
  400. package/dist/src/nile-wysiwyg-editor/ui/find-replace.d.ts +26 -0
  401. package/dist/src/nile-wysiwyg-editor/ui/find-replace.js +178 -0
  402. package/dist/src/nile-wysiwyg-editor/ui/find-replace.js.map +1 -0
  403. package/dist/src/nile-wysiwyg-editor/ui/image-menu.d.ts +18 -0
  404. package/dist/src/nile-wysiwyg-editor/ui/image-menu.js +129 -0
  405. package/dist/src/nile-wysiwyg-editor/ui/image-menu.js.map +1 -0
  406. package/dist/src/nile-wysiwyg-editor/ui/image-panel.d.ts +56 -0
  407. package/dist/src/nile-wysiwyg-editor/ui/image-panel.js +349 -0
  408. package/dist/src/nile-wysiwyg-editor/ui/image-panel.js.map +1 -0
  409. package/dist/src/nile-wysiwyg-editor/ui/insert-menu.d.ts +25 -0
  410. package/dist/src/nile-wysiwyg-editor/ui/insert-menu.js +142 -0
  411. package/dist/src/nile-wysiwyg-editor/ui/insert-menu.js.map +1 -0
  412. package/dist/src/nile-wysiwyg-editor/ui/link-editor.d.ts +30 -0
  413. package/dist/src/nile-wysiwyg-editor/ui/link-editor.js +189 -0
  414. package/dist/src/nile-wysiwyg-editor/ui/link-editor.js.map +1 -0
  415. package/dist/src/nile-wysiwyg-editor/ui/markdown-panel.d.ts +24 -0
  416. package/dist/src/nile-wysiwyg-editor/ui/markdown-panel.js +144 -0
  417. package/dist/src/nile-wysiwyg-editor/ui/markdown-panel.js.map +1 -0
  418. package/dist/src/nile-wysiwyg-editor/ui/math-panel.d.ts +31 -0
  419. package/dist/src/nile-wysiwyg-editor/ui/math-panel.js +172 -0
  420. package/dist/src/nile-wysiwyg-editor/ui/math-panel.js.map +1 -0
  421. package/dist/src/nile-wysiwyg-editor/ui/shortcut-help.d.ts +30 -0
  422. package/dist/src/nile-wysiwyg-editor/ui/shortcut-help.js +296 -0
  423. package/dist/src/nile-wysiwyg-editor/ui/shortcut-help.js.map +1 -0
  424. package/dist/src/nile-wysiwyg-editor/ui/source-view.d.ts +19 -0
  425. package/dist/src/nile-wysiwyg-editor/ui/source-view.js +120 -0
  426. package/dist/src/nile-wysiwyg-editor/ui/source-view.js.map +1 -0
  427. package/dist/src/nile-wysiwyg-editor/ui/special-chars.d.ts +20 -0
  428. package/dist/src/nile-wysiwyg-editor/ui/special-chars.js +199 -0
  429. package/dist/src/nile-wysiwyg-editor/ui/special-chars.js.map +1 -0
  430. package/dist/src/nile-wysiwyg-editor/ui/suggest-list.d.ts +31 -0
  431. package/dist/src/nile-wysiwyg-editor/ui/suggest-list.js +133 -0
  432. package/dist/src/nile-wysiwyg-editor/ui/suggest-list.js.map +1 -0
  433. package/dist/src/nile-wysiwyg-editor/ui/table-grid-picker.d.ts +23 -0
  434. package/dist/src/nile-wysiwyg-editor/ui/table-grid-picker.js +177 -0
  435. package/dist/src/nile-wysiwyg-editor/ui/table-grid-picker.js.map +1 -0
  436. package/dist/src/nile-wysiwyg-editor/ui/table-menu.d.ts +16 -0
  437. package/dist/src/nile-wysiwyg-editor/ui/table-menu.js +101 -0
  438. package/dist/src/nile-wysiwyg-editor/ui/table-menu.js.map +1 -0
  439. package/dist/src/version.js +1 -1
  440. package/dist/src/version.js.map +1 -1
  441. package/dist/tsconfig.tsbuildinfo +1 -1
  442. package/package.json +18 -2
  443. package/src/index.ts +57 -1
  444. package/src/internal/glyph.ts +13 -0
  445. package/src/nile-wysiwyg-editor/emoji.ts +137 -0
  446. package/src/nile-wysiwyg-editor/engine/commands.ts +1035 -0
  447. package/src/nile-wysiwyg-editor/engine/create-state.ts +117 -0
  448. package/src/nile-wysiwyg-editor/engine/export.test.ts +113 -0
  449. package/src/nile-wysiwyg-editor/engine/export.ts +242 -0
  450. package/src/nile-wysiwyg-editor/engine/index.ts +69 -0
  451. package/src/nile-wysiwyg-editor/engine/inputrules.ts +169 -0
  452. package/src/nile-wysiwyg-editor/engine/keymap.ts +146 -0
  453. package/src/nile-wysiwyg-editor/engine/markdown-parse.test.ts +148 -0
  454. package/src/nile-wysiwyg-editor/engine/markdown-parse.ts +337 -0
  455. package/src/nile-wysiwyg-editor/engine/markdown.ts +165 -0
  456. package/src/nile-wysiwyg-editor/engine/office-paste.ts +199 -0
  457. package/src/nile-wysiwyg-editor/engine/plugins/code-highlight.ts +173 -0
  458. package/src/nile-wysiwyg-editor/engine/plugins/embed-view.ts +85 -0
  459. package/src/nile-wysiwyg-editor/engine/plugins/embeds.ts +99 -0
  460. package/src/nile-wysiwyg-editor/engine/plugins/find-replace.ts +155 -0
  461. package/src/nile-wysiwyg-editor/engine/plugins/format-painter.ts +80 -0
  462. package/src/nile-wysiwyg-editor/engine/plugins/image-view.ts +220 -0
  463. package/src/nile-wysiwyg-editor/engine/plugins/image.ts +80 -0
  464. package/src/nile-wysiwyg-editor/engine/plugins/link.ts +42 -0
  465. package/src/nile-wysiwyg-editor/engine/plugins/math-view.ts +56 -0
  466. package/src/nile-wysiwyg-editor/engine/plugins/max-length.ts +24 -0
  467. package/src/nile-wysiwyg-editor/engine/plugins/paste.ts +74 -0
  468. package/src/nile-wysiwyg-editor/engine/plugins/placeholder.ts +24 -0
  469. package/src/nile-wysiwyg-editor/engine/plugins/single-line.ts +47 -0
  470. package/src/nile-wysiwyg-editor/engine/plugins/suggestions.ts +110 -0
  471. package/src/nile-wysiwyg-editor/engine/plugins/tables.ts +12 -0
  472. package/src/nile-wysiwyg-editor/engine/plugins/task-list.ts +65 -0
  473. package/src/nile-wysiwyg-editor/engine/pm.test.ts +1088 -0
  474. package/src/nile-wysiwyg-editor/engine/productivity.test.ts +163 -0
  475. package/src/nile-wysiwyg-editor/engine/sanitize.ts +156 -0
  476. package/src/nile-wysiwyg-editor/engine/schema.ts +859 -0
  477. package/src/nile-wysiwyg-editor/engine/selection-state.ts +210 -0
  478. package/src/nile-wysiwyg-editor/engine/serializer.ts +78 -0
  479. package/src/nile-wysiwyg-editor/index.ts +3 -0
  480. package/src/nile-wysiwyg-editor/nile-wysiwyg-editor.css.ts +782 -0
  481. package/src/nile-wysiwyg-editor/nile-wysiwyg-editor.test.ts +750 -0
  482. package/src/nile-wysiwyg-editor/nile-wysiwyg-editor.ts +2155 -0
  483. package/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/index.ts +1 -0
  484. package/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.ts +251 -0
  485. package/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.ts +772 -0
  486. package/src/nile-wysiwyg-editor/types.ts +83 -0
  487. package/src/nile-wysiwyg-editor/ui/bookmark-panel.ts +155 -0
  488. package/src/nile-wysiwyg-editor/ui/bubble-menu.ts +135 -0
  489. package/src/nile-wysiwyg-editor/ui/code-block-menu.ts +105 -0
  490. package/src/nile-wysiwyg-editor/ui/embed-menu.ts +133 -0
  491. package/src/nile-wysiwyg-editor/ui/embed-panel.ts +143 -0
  492. package/src/nile-wysiwyg-editor/ui/emoji-picker.ts +152 -0
  493. package/src/nile-wysiwyg-editor/ui/find-replace.ts +174 -0
  494. package/src/nile-wysiwyg-editor/ui/image-menu.ts +140 -0
  495. package/src/nile-wysiwyg-editor/ui/image-panel.ts +337 -0
  496. package/src/nile-wysiwyg-editor/ui/insert-menu.ts +142 -0
  497. package/src/nile-wysiwyg-editor/ui/link-editor.ts +180 -0
  498. package/src/nile-wysiwyg-editor/ui/markdown-panel.ts +143 -0
  499. package/src/nile-wysiwyg-editor/ui/math-panel.ts +169 -0
  500. package/src/nile-wysiwyg-editor/ui/shortcut-help.ts +311 -0
  501. package/src/nile-wysiwyg-editor/ui/source-view.ts +119 -0
  502. package/src/nile-wysiwyg-editor/ui/special-chars.ts +209 -0
  503. package/src/nile-wysiwyg-editor/ui/suggest-list.ts +138 -0
  504. package/src/nile-wysiwyg-editor/ui/table-grid-picker.ts +173 -0
  505. package/src/nile-wysiwyg-editor/ui/table-menu.ts +109 -0
  506. package/vscode-html-custom-data.json +450 -0
  507. package/web-dev-server.config.mjs +6 -2
  508. package/dist/index-5fef1a0d.esm.js +0 -1
  509. package/dist/index-8f38fae3.cjs.js +0 -2
  510. package/dist/index-8f38fae3.cjs.js.map +0 -1
@@ -0,0 +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"]}
@@ -0,0 +1,129 @@
1
+ import { expect } from '@open-wc/testing';
2
+ import { TextSelection } from 'prosemirror-state';
3
+ import { defaultSchema, htmlToDoc, docToHtml, createEditorState, getCommand, isExcelHtml, isOfficeHtml, cleanOfficeHtml, armFormatPainter, applyFormatPainter, isFormatPainterArmed, disarmFormatPainter, } from './index';
4
+ /** Editor state with the whole document selected. */
5
+ function stateWithAllSelected(html) {
6
+ const doc = htmlToDoc(defaultSchema, html);
7
+ const state = createEditorState({ doc });
8
+ const selection = TextSelection.create(state.doc, 1, state.doc.content.size - 1);
9
+ return state.apply(state.tr.setSelection(selection));
10
+ }
11
+ /** Runs a command against a state and returns the resulting state. */
12
+ function run(state, name, attrs) {
13
+ let next = state;
14
+ const command = getCommand(state, name, attrs);
15
+ command?.(state, tr => {
16
+ next = state.apply(tr);
17
+ });
18
+ return next;
19
+ }
20
+ describe('changeCase command', () => {
21
+ it('uppercases the selection', () => {
22
+ const state = run(stateWithAllSelected('<p>Hello world</p>'), 'changeCase', { textCase: 'upper' });
23
+ expect(docToHtml(state.doc)).to.equal('<p>HELLO WORLD</p>');
24
+ });
25
+ it('lowercases the selection', () => {
26
+ const state = run(stateWithAllSelected('<p>HELLO</p>'), 'changeCase', { textCase: 'lower' });
27
+ expect(docToHtml(state.doc)).to.equal('<p>hello</p>');
28
+ });
29
+ it('title-cases the selection', () => {
30
+ const state = run(stateWithAllSelected('<p>hello brave world</p>'), 'changeCase', { textCase: 'title' });
31
+ expect(docToHtml(state.doc)).to.equal('<p>Hello Brave World</p>');
32
+ });
33
+ it('sentence-cases the selection', () => {
34
+ const state = run(stateWithAllSelected('<p>hello. there is more. ok</p>'), 'changeCase', {
35
+ textCase: 'sentence',
36
+ });
37
+ expect(docToHtml(state.doc)).to.equal('<p>Hello. There is more. Ok</p>');
38
+ });
39
+ it('preserves marks across the transform', () => {
40
+ const state = run(stateWithAllSelected('<p><strong>bold</strong> plain</p>'), 'changeCase', {
41
+ textCase: 'upper',
42
+ });
43
+ expect(docToHtml(state.doc)).to.equal('<p><strong>BOLD</strong> PLAIN</p>');
44
+ });
45
+ it('is a no-op with an empty selection', () => {
46
+ const doc = htmlToDoc(defaultSchema, '<p>hello</p>');
47
+ const state = createEditorState({ doc });
48
+ expect(getCommand(state, 'changeCase', { textCase: 'upper' })(state, () => { })).to.be.false;
49
+ });
50
+ });
51
+ describe('merge field', () => {
52
+ it('inserts a merge-field node', () => {
53
+ const doc = htmlToDoc(defaultSchema, '<p></p>');
54
+ let state = createEditorState({ doc });
55
+ state = state.apply(state.tr.setSelection(TextSelection.create(state.doc, 1)));
56
+ const state2 = run(state, 'insertMergeField', { id: 'first_name', label: 'First name' });
57
+ const out = docToHtml(state2.doc);
58
+ expect(out).to.include('data-merge-field="first_name"');
59
+ expect(out).to.include('First name');
60
+ });
61
+ it('round-trips through HTML', () => {
62
+ const html = '<p><span data-merge-field="email" data-merge-label="Email">Email</span></p>';
63
+ expect(docToHtml(htmlToDoc(defaultSchema, html))).to.include('data-merge-field="email"');
64
+ });
65
+ });
66
+ describe('math', () => {
67
+ it('inserts a math node', () => {
68
+ const doc = htmlToDoc(defaultSchema, '<p></p>');
69
+ let state = createEditorState({ doc });
70
+ state = state.apply(state.tr.setSelection(TextSelection.create(state.doc, 1)));
71
+ const state2 = run(state, 'insertMath', { latex: 'a^2 + b^2', mathDisplay: 'block' });
72
+ const out = docToHtml(state2.doc);
73
+ expect(out).to.include('data-math="a^2 + b^2"');
74
+ expect(out).to.include('data-math-display="block"');
75
+ });
76
+ it('round-trips through HTML', () => {
77
+ const html = '<p><span data-math="x/y" data-math-display="inline">x/y</span></p>';
78
+ expect(docToHtml(htmlToDoc(defaultSchema, html))).to.include('data-math="x/y"');
79
+ });
80
+ });
81
+ describe('format painter', () => {
82
+ it('copies marks from one selection and applies to the next', () => {
83
+ // <p>BOLD plain</p> — arm over the bold word, then apply to "plain".
84
+ const doc = htmlToDoc(defaultSchema, '<p><strong>bold</strong> plain</p>');
85
+ let state = createEditorState({ doc });
86
+ // Select the bold word (positions 1..5).
87
+ state = state.apply(state.tr.setSelection(TextSelection.create(state.doc, 1, 5)));
88
+ state = state.apply(armFormatPainter(state));
89
+ expect(isFormatPainterArmed(state)).to.be.true;
90
+ // Select "plain" (positions 6..11) and apply.
91
+ state = state.apply(state.tr.setSelection(TextSelection.create(state.doc, 6, 11)));
92
+ const applyTr = applyFormatPainter(state);
93
+ expect(applyTr).to.not.be.null;
94
+ state = state.apply(applyTr);
95
+ // "plain" (6..11) becomes bold; the space at 5 stays plain, so the two
96
+ // bold runs render as separate <strong> tags.
97
+ expect(docToHtml(state.doc)).to.equal('<p><strong>bold</strong> <strong>plain</strong></p>');
98
+ expect(isFormatPainterArmed(state)).to.be.false;
99
+ });
100
+ it('disarms without applying', () => {
101
+ const doc = htmlToDoc(defaultSchema, '<p><strong>bold</strong></p>');
102
+ let state = createEditorState({ doc });
103
+ state = state.apply(state.tr.setSelection(TextSelection.create(state.doc, 1, 5)));
104
+ state = state.apply(armFormatPainter(state));
105
+ state = state.apply(disarmFormatPainter(state));
106
+ expect(isFormatPainterArmed(state)).to.be.false;
107
+ });
108
+ });
109
+ describe('Excel paste', () => {
110
+ const excel = '<html xmlns:x="urn:schemas-microsoft-com:office:excel"><body>' +
111
+ '<table><tr>' +
112
+ '<td align="center" bgcolor="#ffff00" style="mso-number-format:General">Total</td>' +
113
+ '</tr></table></body></html>';
114
+ it('is detected as Excel and Office HTML', () => {
115
+ expect(isExcelHtml(excel)).to.be.true;
116
+ expect(isOfficeHtml(excel)).to.be.true;
117
+ });
118
+ it('preserves cell background and alignment', () => {
119
+ const cleaned = cleanOfficeHtml(excel);
120
+ const doc = htmlToDoc(defaultSchema, cleaned);
121
+ const out = docToHtml(doc);
122
+ expect(out).to.include('Total');
123
+ // Alignment survives on the wrapped paragraph.
124
+ expect(out).to.match(/text-align:\s*center/);
125
+ // Background survives on the cell.
126
+ expect(out.toLowerCase()).to.include('background-color');
127
+ });
128
+ });
129
+ //# sourceMappingURL=productivity.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"productivity.test.js","sourceRoot":"","sources":["../../../../src/nile-wysiwyg-editor/engine/productivity.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from '@open-wc/testing';\nimport { TextSelection } from 'prosemirror-state';\nimport {\n defaultSchema,\n htmlToDoc,\n docToHtml,\n createEditorState,\n getCommand,\n isExcelHtml,\n isOfficeHtml,\n cleanOfficeHtml,\n armFormatPainter,\n applyFormatPainter,\n isFormatPainterArmed,\n disarmFormatPainter,\n} from './index';\n\n/** 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\n/** Runs a command against a state and returns the resulting state. */\nfunction run(state: ReturnType<typeof stateWithAllSelected>, name: Parameters<typeof getCommand>[1], attrs?: Parameters<typeof getCommand>[2]) {\n let next = state;\n const command = getCommand(state, name, attrs);\n command?.(state, tr => {\n next = state.apply(tr);\n });\n return next;\n}\n\ndescribe('changeCase command', () => {\n it('uppercases the selection', () => {\n const state = run(stateWithAllSelected('<p>Hello world</p>'), 'changeCase', { textCase: 'upper' });\n expect(docToHtml(state.doc)).to.equal('<p>HELLO WORLD</p>');\n });\n\n it('lowercases the selection', () => {\n const state = run(stateWithAllSelected('<p>HELLO</p>'), 'changeCase', { textCase: 'lower' });\n expect(docToHtml(state.doc)).to.equal('<p>hello</p>');\n });\n\n it('title-cases the selection', () => {\n const state = run(stateWithAllSelected('<p>hello brave world</p>'), 'changeCase', { textCase: 'title' });\n expect(docToHtml(state.doc)).to.equal('<p>Hello Brave World</p>');\n });\n\n it('sentence-cases the selection', () => {\n const state = run(stateWithAllSelected('<p>hello. there is more. ok</p>'), 'changeCase', {\n textCase: 'sentence',\n });\n expect(docToHtml(state.doc)).to.equal('<p>Hello. There is more. Ok</p>');\n });\n\n it('preserves marks across the transform', () => {\n const state = run(stateWithAllSelected('<p><strong>bold</strong> plain</p>'), 'changeCase', {\n textCase: 'upper',\n });\n expect(docToHtml(state.doc)).to.equal('<p><strong>BOLD</strong> PLAIN</p>');\n });\n\n it('is a no-op with an empty selection', () => {\n const doc = htmlToDoc(defaultSchema, '<p>hello</p>');\n const state = createEditorState({ doc });\n expect(getCommand(state, 'changeCase', { textCase: 'upper' })!(state, () => {})).to.be.false;\n });\n});\n\ndescribe('merge field', () => {\n it('inserts a merge-field node', () => {\n const doc = htmlToDoc(defaultSchema, '<p></p>');\n let state = createEditorState({ doc });\n state = state.apply(\n state.tr.setSelection(TextSelection.create(state.doc, 1))\n );\n const state2 = run(state, 'insertMergeField', { id: 'first_name', label: 'First name' });\n const out = docToHtml(state2.doc);\n expect(out).to.include('data-merge-field=\"first_name\"');\n expect(out).to.include('First name');\n });\n\n it('round-trips through HTML', () => {\n const html = '<p><span data-merge-field=\"email\" data-merge-label=\"Email\">Email</span></p>';\n expect(docToHtml(htmlToDoc(defaultSchema, html))).to.include('data-merge-field=\"email\"');\n });\n});\n\ndescribe('math', () => {\n it('inserts a math node', () => {\n const doc = htmlToDoc(defaultSchema, '<p></p>');\n let state = createEditorState({ doc });\n state = state.apply(state.tr.setSelection(TextSelection.create(state.doc, 1)));\n const state2 = run(state, 'insertMath', { latex: 'a^2 + b^2', mathDisplay: 'block' });\n const out = docToHtml(state2.doc);\n expect(out).to.include('data-math=\"a^2 + b^2\"');\n expect(out).to.include('data-math-display=\"block\"');\n });\n\n it('round-trips through HTML', () => {\n const html = '<p><span data-math=\"x/y\" data-math-display=\"inline\">x/y</span></p>';\n expect(docToHtml(htmlToDoc(defaultSchema, html))).to.include('data-math=\"x/y\"');\n });\n});\n\ndescribe('format painter', () => {\n it('copies marks from one selection and applies to the next', () => {\n // <p>BOLD plain</p> — arm over the bold word, then apply to \"plain\".\n const doc = htmlToDoc(defaultSchema, '<p><strong>bold</strong> plain</p>');\n let state = createEditorState({ doc });\n // Select the bold word (positions 1..5).\n state = state.apply(state.tr.setSelection(TextSelection.create(state.doc, 1, 5)));\n state = state.apply(armFormatPainter(state)!);\n expect(isFormatPainterArmed(state)).to.be.true;\n\n // Select \"plain\" (positions 6..11) and apply.\n state = state.apply(state.tr.setSelection(TextSelection.create(state.doc, 6, 11)));\n const applyTr = applyFormatPainter(state);\n expect(applyTr).to.not.be.null;\n state = state.apply(applyTr!);\n\n // \"plain\" (6..11) becomes bold; the space at 5 stays plain, so the two\n // bold runs render as separate <strong> tags.\n expect(docToHtml(state.doc)).to.equal('<p><strong>bold</strong> <strong>plain</strong></p>');\n expect(isFormatPainterArmed(state)).to.be.false;\n });\n\n it('disarms without applying', () => {\n const doc = htmlToDoc(defaultSchema, '<p><strong>bold</strong></p>');\n let state = createEditorState({ doc });\n state = state.apply(state.tr.setSelection(TextSelection.create(state.doc, 1, 5)));\n state = state.apply(armFormatPainter(state)!);\n state = state.apply(disarmFormatPainter(state));\n expect(isFormatPainterArmed(state)).to.be.false;\n });\n});\n\ndescribe('Excel paste', () => {\n const excel =\n '<html xmlns:x=\"urn:schemas-microsoft-com:office:excel\"><body>' +\n '<table><tr>' +\n '<td align=\"center\" bgcolor=\"#ffff00\" style=\"mso-number-format:General\">Total</td>' +\n '</tr></table></body></html>';\n\n it('is detected as Excel and Office HTML', () => {\n expect(isExcelHtml(excel)).to.be.true;\n expect(isOfficeHtml(excel)).to.be.true;\n });\n\n it('preserves cell background and alignment', () => {\n const cleaned = cleanOfficeHtml(excel);\n const doc = htmlToDoc(defaultSchema, cleaned);\n const out = docToHtml(doc);\n expect(out).to.include('Total');\n // Alignment survives on the wrapped paragraph.\n expect(out).to.match(/text-align:\\s*center/);\n // Background survives on the cell.\n expect(out.toLowerCase()).to.include('background-color');\n });\n});\n"]}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * HTML sanitization pre-pass. The ProseMirror schema is the real whitelist —
3
+ * anything it can't parse is dropped — but this pass removes actively
4
+ * dangerous content (scripts, event handlers, javascript: URLs) before the
5
+ * string ever touches a live DOM, and strips style declarations down to the
6
+ * set the schema understands.
7
+ */
8
+ export declare function isSafeUrl(url: string, allowDataImage?: boolean): boolean;
9
+ /**
10
+ * Sanitizes an HTML string. Parsing happens in an inert document created by
11
+ * DOMParser, so embedded scripts never execute and images never load.
12
+ */
13
+ export declare function sanitizeHtml(html: string): string;
@@ -0,0 +1,155 @@
1
+ /**
2
+ * HTML sanitization pre-pass. The ProseMirror schema is the real whitelist —
3
+ * anything it can't parse is dropped — but this pass removes actively
4
+ * dangerous content (scripts, event handlers, javascript: URLs) before the
5
+ * string ever touches a live DOM, and strips style declarations down to the
6
+ * set the schema understands.
7
+ */
8
+ import { isAllowedEmbedSrc } from './plugins/embeds';
9
+ /** Elements removed together with their content. */
10
+ const DROP_WITH_CONTENT = new Set([
11
+ 'script', 'style', 'frame', 'frameset', 'object', 'embed',
12
+ 'applet', 'form', 'input', 'textarea', 'select', 'button', 'meta', 'link',
13
+ 'base', 'title', 'noscript', 'template', 'svg', 'math', 'canvas', 'audio',
14
+ 'video', 'dialog', 'slot',
15
+ ]);
16
+ /** Elements kept as-is (with filtered attributes). Extended in later phases. */
17
+ const ALLOWED_TAGS = new Set([
18
+ 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'blockquote', 'ul', 'ol', 'li',
19
+ 'br', 'hr', 'a', 'b', 'strong', 'i', 'em', 'u', 's', 'strike', 'del',
20
+ 'span', 'code', 'sub', 'sup', 'div', 'font',
21
+ 'pre', 'figure', 'figcaption', 'img', 'iframe',
22
+ 'table', 'thead', 'tbody', 'tfoot', 'tr', 'td', 'th', 'colgroup', 'col',
23
+ ]);
24
+ /** Attributes allowed per tag (on top of GLOBAL_ATTRS). */
25
+ const TAG_ATTRS = {
26
+ a: new Set(['href', 'title', 'target', 'rel', 'id', 'name', 'data-bookmark']),
27
+ table: new Set(['role', 'data-layout']),
28
+ ol: new Set(['start', 'type', 'data-list-style']),
29
+ ul: new Set(['data-task-list']),
30
+ figure: new Set(['data-align']),
31
+ li: new Set(['data-task-item', 'data-checked']),
32
+ span: new Set([
33
+ 'data-mention-trigger', 'data-mention-key', 'data-mention-label',
34
+ 'data-merge-field', 'data-merge-label', 'data-math', 'data-math-display',
35
+ ]),
36
+ pre: new Set(['data-language']),
37
+ img: new Set(['src', 'alt', 'title', 'width', 'height']),
38
+ td: new Set(['colspan', 'rowspan', 'data-colwidth']),
39
+ th: new Set(['colspan', 'rowspan', 'data-colwidth']),
40
+ col: new Set(['span', 'width']),
41
+ div: new Set(['data-embed-provider', 'data-width', 'data-align']),
42
+ iframe: new Set(['src', 'title', 'frameborder', 'allowfullscreen', 'allow']),
43
+ };
44
+ const GLOBAL_ATTRS = new Set(['style', 'align']);
45
+ /** Style declarations the schema can represent. Everything else is noise. */
46
+ const ALLOWED_STYLES = new Set([
47
+ 'color', 'background-color', 'font-family', 'font-size', 'font-style',
48
+ 'font-weight', 'text-align', 'text-decoration', 'text-decoration-line',
49
+ 'vertical-align', 'margin-left', 'margin-inline-start', 'list-style-type',
50
+ 'line-height',
51
+ ]);
52
+ const SAFE_URL_PROTOCOLS = ['http:', 'https:', 'mailto:', 'tel:', 'ftp:'];
53
+ export function isSafeUrl(url, allowDataImage = false) {
54
+ const trimmed = url.trim();
55
+ if (trimmed === '')
56
+ return false;
57
+ // Relative URLs and fragments have no protocol — safe.
58
+ if (/^(#|\/|\.\/|\.\.\/)/.test(trimmed))
59
+ return true;
60
+ const match = /^([a-z][a-z0-9+.-]*):/i.exec(trimmed);
61
+ if (!match)
62
+ return true;
63
+ const protocol = `${match[1].toLowerCase()}:`;
64
+ if (SAFE_URL_PROTOCOLS.includes(protocol))
65
+ return true;
66
+ if (allowDataImage && protocol === 'data:') {
67
+ // Raster images only — data:image/svg+xml can carry scripts.
68
+ return /^data:image\/(png|gif|jpe?g|webp|avif|bmp);/i.test(trimmed);
69
+ }
70
+ return false;
71
+ }
72
+ /** Size styles allowed only where they are part of the document model. */
73
+ const SIZED_TAGS = {
74
+ img: new Set(['width', 'height']),
75
+ figure: new Set(['width', 'margin-right']),
76
+ div: new Set(['width', 'max-width']),
77
+ };
78
+ function filterStyle(value, tag) {
79
+ const extra = SIZED_TAGS[tag];
80
+ return value
81
+ .split(';')
82
+ .map(decl => decl.trim())
83
+ .filter(decl => {
84
+ const name = decl.slice(0, decl.indexOf(':')).trim().toLowerCase();
85
+ if (!ALLOWED_STYLES.has(name) && !(extra && extra.has(name)))
86
+ return false;
87
+ // Defense in depth: CSS url()/expression() smuggling.
88
+ return !/url\s*\(|expression\s*\(/i.test(decl);
89
+ })
90
+ .join('; ');
91
+ }
92
+ function sanitizeElement(el) {
93
+ const tag = el.tagName.toLowerCase();
94
+ const allowed = TAG_ATTRS[tag];
95
+ for (const attr of Array.from(el.attributes)) {
96
+ const name = attr.name.toLowerCase();
97
+ const keep = (GLOBAL_ATTRS.has(name) || (allowed !== undefined && allowed.has(name))) &&
98
+ !name.startsWith('on');
99
+ if (!keep) {
100
+ el.removeAttribute(attr.name);
101
+ continue;
102
+ }
103
+ if (name === 'style') {
104
+ const filtered = filterStyle(attr.value, tag);
105
+ if (filtered)
106
+ el.setAttribute('style', filtered);
107
+ else
108
+ el.removeAttribute('style');
109
+ }
110
+ else if (name === 'href' || name === 'src') {
111
+ // Raster data: URLs are allowed on images only.
112
+ if (!isSafeUrl(attr.value, tag === 'img'))
113
+ el.removeAttribute(attr.name);
114
+ }
115
+ else if (name === 'target') {
116
+ if (attr.value === '_blank')
117
+ el.setAttribute('rel', 'noopener noreferrer');
118
+ else
119
+ el.removeAttribute('target');
120
+ }
121
+ }
122
+ }
123
+ function walk(node) {
124
+ for (const child of Array.from(node.children)) {
125
+ const tag = child.tagName.toLowerCase();
126
+ if (DROP_WITH_CONTENT.has(tag)) {
127
+ child.remove();
128
+ continue;
129
+ }
130
+ // iframes are allowed ONLY for allowlisted embed providers.
131
+ if (tag === 'iframe' && !isAllowedEmbedSrc(child.getAttribute('src') ?? '')) {
132
+ child.remove();
133
+ continue;
134
+ }
135
+ if (!ALLOWED_TAGS.has(tag)) {
136
+ // Unknown wrapper (article, section, table for now, …): keep its
137
+ // content, drop the element itself.
138
+ walk(child);
139
+ child.replaceWith(...Array.from(child.childNodes));
140
+ continue;
141
+ }
142
+ sanitizeElement(child);
143
+ walk(child);
144
+ }
145
+ }
146
+ /**
147
+ * Sanitizes an HTML string. Parsing happens in an inert document created by
148
+ * DOMParser, so embedded scripts never execute and images never load.
149
+ */
150
+ export function sanitizeHtml(html) {
151
+ const doc = new DOMParser().parseFromString(html, 'text/html');
152
+ walk(doc.body);
153
+ return doc.body.innerHTML;
154
+ }
155
+ //# sourceMappingURL=sanitize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../../../../src/nile-wysiwyg-editor/engine/sanitize.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,oDAAoD;AACpD,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO;IACzD,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM;IACzE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO;IACzE,OAAO,EAAE,QAAQ,EAAE,MAAM;CAC1B,CAAC,CAAC;AAEH,gFAAgF;AAChF,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAC3B,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACvE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK;IACpE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM;IAC3C,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ;IAC9C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK;CACxE,CAAC,CAAC;AAEH,2DAA2D;AAC3D,MAAM,SAAS,GAAgC;IAC7C,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;IAC7E,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACvC,EAAE,EAAE,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACjD,EAAE,EAAE,IAAI,GAAG,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC/B,MAAM,EAAE,IAAI,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;IAC/B,EAAE,EAAE,IAAI,GAAG,CAAC,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;IAC/C,IAAI,EAAE,IAAI,GAAG,CAAC;QACZ,sBAAsB,EAAE,kBAAkB,EAAE,oBAAoB;QAChE,kBAAkB,EAAE,kBAAkB,EAAE,WAAW,EAAE,mBAAmB;KACzE,CAAC;IACF,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC;IAC/B,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACxD,EAAE,EAAE,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IACpD,EAAE,EAAE,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IACpD,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,qBAAqB,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;IACjE,MAAM,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC;CAC7E,CAAC;AAEF,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAEjD,6EAA6E;AAC7E,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY;IACrE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,sBAAsB;IACtE,gBAAgB,EAAE,aAAa,EAAE,qBAAqB,EAAE,iBAAiB;IACzE,aAAa;CACd,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAE1E,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,cAAc,GAAG,KAAK;IAC3D,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IACjC,uDAAuD;IACvD,IAAI,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACrD,MAAM,KAAK,GAAG,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC;IAC9C,IAAI,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACvD,IAAI,cAAc,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC3C,6DAA6D;QAC7D,OAAO,8CAA8C,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,GAAgC;IAC9C,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACjC,MAAM,EAAE,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAC1C,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;CACrC,CAAC;AAEF,SAAS,WAAW,CAAC,KAAa,EAAE,GAAW;IAC7C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO,KAAK;SACT,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SACxB,MAAM,CAAC,IAAI,CAAC,EAAE;QACb,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACnE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3E,sDAAsD;QACtD,OAAO,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,EAAW;IAClC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,IAAI,GACR,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YACxE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9B,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC9C,IAAI,QAAQ;gBAAE,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;;gBAC5C,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;aAAM,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YAC7C,gDAAgD;YAChD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,KAAK,KAAK,CAAC;gBAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3E,CAAC;aAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ;gBAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;;gBACtE,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,IAAI,CAAC,IAAa;IACzB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACxC,IAAI,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,KAAK,CAAC,MAAM,EAAE,CAAC;YACf,SAAS;QACX,CAAC;QACD,4DAA4D;QAC5D,IAAI,GAAG,KAAK,QAAQ,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAC5E,KAAK,CAAC,MAAM,EAAE,CAAC;YACf,SAAS;QACX,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,iEAAiE;YACjE,oCAAoC;YACpC,IAAI,CAAC,KAAK,CAAC,CAAC;YACZ,KAAK,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;YACnD,SAAS;QACX,CAAC;QACD,eAAe,CAAC,KAAK,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC/D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACf,OAAO,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;AAC5B,CAAC","sourcesContent":["/**\n * HTML sanitization pre-pass. The ProseMirror schema is the real whitelist —\n * anything it can't parse is dropped — but this pass removes actively\n * dangerous content (scripts, event handlers, javascript: URLs) before the\n * string ever touches a live DOM, and strips style declarations down to the\n * set the schema understands.\n */\n\nimport { isAllowedEmbedSrc } from './plugins/embeds';\n\n/** Elements removed together with their content. */\nconst DROP_WITH_CONTENT = new Set([\n 'script', 'style', 'frame', 'frameset', 'object', 'embed',\n 'applet', 'form', 'input', 'textarea', 'select', 'button', 'meta', 'link',\n 'base', 'title', 'noscript', 'template', 'svg', 'math', 'canvas', 'audio',\n 'video', 'dialog', 'slot',\n]);\n\n/** Elements kept as-is (with filtered attributes). Extended in later phases. */\nconst ALLOWED_TAGS = new Set([\n 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'blockquote', 'ul', 'ol', 'li',\n 'br', 'hr', 'a', 'b', 'strong', 'i', 'em', 'u', 's', 'strike', 'del',\n 'span', 'code', 'sub', 'sup', 'div', 'font',\n 'pre', 'figure', 'figcaption', 'img', 'iframe',\n 'table', 'thead', 'tbody', 'tfoot', 'tr', 'td', 'th', 'colgroup', 'col',\n]);\n\n/** Attributes allowed per tag (on top of GLOBAL_ATTRS). */\nconst TAG_ATTRS: Record<string, Set<string>> = {\n a: new Set(['href', 'title', 'target', 'rel', 'id', 'name', 'data-bookmark']),\n table: new Set(['role', 'data-layout']),\n ol: new Set(['start', 'type', 'data-list-style']),\n ul: new Set(['data-task-list']),\n figure: new Set(['data-align']),\n li: new Set(['data-task-item', 'data-checked']),\n span: new Set([\n 'data-mention-trigger', 'data-mention-key', 'data-mention-label',\n 'data-merge-field', 'data-merge-label', 'data-math', 'data-math-display',\n ]),\n pre: new Set(['data-language']),\n img: new Set(['src', 'alt', 'title', 'width', 'height']),\n td: new Set(['colspan', 'rowspan', 'data-colwidth']),\n th: new Set(['colspan', 'rowspan', 'data-colwidth']),\n col: new Set(['span', 'width']),\n div: new Set(['data-embed-provider', 'data-width', 'data-align']),\n iframe: new Set(['src', 'title', 'frameborder', 'allowfullscreen', 'allow']),\n};\n\nconst GLOBAL_ATTRS = new Set(['style', 'align']);\n\n/** Style declarations the schema can represent. Everything else is noise. */\nconst ALLOWED_STYLES = new Set([\n 'color', 'background-color', 'font-family', 'font-size', 'font-style',\n 'font-weight', 'text-align', 'text-decoration', 'text-decoration-line',\n 'vertical-align', 'margin-left', 'margin-inline-start', 'list-style-type',\n 'line-height',\n]);\n\nconst SAFE_URL_PROTOCOLS = ['http:', 'https:', 'mailto:', 'tel:', 'ftp:'];\n\nexport function isSafeUrl(url: string, allowDataImage = false): boolean {\n const trimmed = url.trim();\n if (trimmed === '') return false;\n // Relative URLs and fragments have no protocol — safe.\n if (/^(#|\\/|\\.\\/|\\.\\.\\/)/.test(trimmed)) return true;\n const match = /^([a-z][a-z0-9+.-]*):/i.exec(trimmed);\n if (!match) return true;\n const protocol = `${match[1].toLowerCase()}:`;\n if (SAFE_URL_PROTOCOLS.includes(protocol)) return true;\n if (allowDataImage && protocol === 'data:') {\n // Raster images only — data:image/svg+xml can carry scripts.\n return /^data:image\\/(png|gif|jpe?g|webp|avif|bmp);/i.test(trimmed);\n }\n return false;\n}\n\n/** Size styles allowed only where they are part of the document model. */\nconst SIZED_TAGS: Record<string, Set<string>> = {\n img: new Set(['width', 'height']),\n figure: new Set(['width', 'margin-right']),\n div: new Set(['width', 'max-width']),\n};\n\nfunction filterStyle(value: string, tag: string): string {\n const extra = SIZED_TAGS[tag];\n return value\n .split(';')\n .map(decl => decl.trim())\n .filter(decl => {\n const name = decl.slice(0, decl.indexOf(':')).trim().toLowerCase();\n if (!ALLOWED_STYLES.has(name) && !(extra && extra.has(name))) return false;\n // Defense in depth: CSS url()/expression() smuggling.\n return !/url\\s*\\(|expression\\s*\\(/i.test(decl);\n })\n .join('; ');\n}\n\nfunction sanitizeElement(el: Element): void {\n const tag = el.tagName.toLowerCase();\n const allowed = TAG_ATTRS[tag];\n for (const attr of Array.from(el.attributes)) {\n const name = attr.name.toLowerCase();\n const keep =\n (GLOBAL_ATTRS.has(name) || (allowed !== undefined && allowed.has(name))) &&\n !name.startsWith('on');\n if (!keep) {\n el.removeAttribute(attr.name);\n continue;\n }\n if (name === 'style') {\n const filtered = filterStyle(attr.value, tag);\n if (filtered) el.setAttribute('style', filtered);\n else el.removeAttribute('style');\n } else if (name === 'href' || name === 'src') {\n // Raster data: URLs are allowed on images only.\n if (!isSafeUrl(attr.value, tag === 'img')) el.removeAttribute(attr.name);\n } else if (name === 'target') {\n if (attr.value === '_blank') el.setAttribute('rel', 'noopener noreferrer');\n else el.removeAttribute('target');\n }\n }\n}\n\nfunction walk(node: Element): void {\n for (const child of Array.from(node.children)) {\n const tag = child.tagName.toLowerCase();\n if (DROP_WITH_CONTENT.has(tag)) {\n child.remove();\n continue;\n }\n // iframes are allowed ONLY for allowlisted embed providers.\n if (tag === 'iframe' && !isAllowedEmbedSrc(child.getAttribute('src') ?? '')) {\n child.remove();\n continue;\n }\n if (!ALLOWED_TAGS.has(tag)) {\n // Unknown wrapper (article, section, table for now, …): keep its\n // content, drop the element itself.\n walk(child);\n child.replaceWith(...Array.from(child.childNodes));\n continue;\n }\n sanitizeElement(child);\n walk(child);\n }\n}\n\n/**\n * Sanitizes an HTML string. Parsing happens in an inert document created by\n * DOMParser, so embedded scripts never execute and images never load.\n */\nexport function sanitizeHtml(html: string): string {\n const doc = new DOMParser().parseFromString(html, 'text/html');\n walk(doc.body);\n return doc.body.innerHTML;\n}\n"]}