@blocknote/core 0.18.0 → 0.19.0

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 (508) hide show
  1. package/dist/blocknote.js +2191 -2068
  2. package/dist/blocknote.js.map +1 -1
  3. package/dist/blocknote.umd.cjs +9 -9
  4. package/dist/blocknote.umd.cjs.map +1 -1
  5. package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.js +27 -0
  6. package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.js.map +1 -0
  7. package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.test.js +99 -0
  8. package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.test.js.map +1 -0
  9. package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.js +97 -0
  10. package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.js.map +1 -0
  11. package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.js +88 -0
  12. package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.js.map +1 -0
  13. package/dist/src/api/blockManipulation/commands/moveBlock/moveBlock.js +116 -0
  14. package/dist/src/api/blockManipulation/commands/moveBlock/moveBlock.js.map +1 -0
  15. package/dist/src/api/blockManipulation/commands/moveBlock/moveBlock.test.js +106 -0
  16. package/dist/src/api/blockManipulation/commands/moveBlock/moveBlock.test.js.map +1 -0
  17. package/dist/src/api/blockManipulation/commands/nestBlock/nestBlock.js +57 -0
  18. package/dist/src/api/blockManipulation/commands/nestBlock/nestBlock.js.map +1 -0
  19. package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.js +43 -0
  20. package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.js.map +1 -0
  21. package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.test.js +27 -0
  22. package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.test.js.map +1 -0
  23. package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.js +29 -0
  24. package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.js.map +1 -0
  25. package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.test.js +157 -0
  26. package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.test.js.map +1 -0
  27. package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.js +27 -0
  28. package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.js.map +1 -0
  29. package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.test.js +64 -0
  30. package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.test.js.map +1 -0
  31. package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.js +145 -0
  32. package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.js.map +1 -0
  33. package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.test.js +252 -0
  34. package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.test.js.map +1 -0
  35. package/dist/src/api/blockManipulation/insertContentAt.js +64 -0
  36. package/dist/src/api/blockManipulation/insertContentAt.js.map +1 -0
  37. package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.js +76 -0
  38. package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.js.map +1 -0
  39. package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.test.js +33 -0
  40. package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.test.js.map +1 -0
  41. package/dist/src/api/blockManipulation/setupTestEnv.js +172 -0
  42. package/dist/src/api/blockManipulation/setupTestEnv.js.map +1 -0
  43. package/dist/src/api/clipboard/clipboard.test.js +246 -0
  44. package/dist/src/api/clipboard/clipboard.test.js.map +1 -0
  45. package/dist/src/api/clipboard/fromClipboard/acceptedMIMETypes.js +8 -0
  46. package/dist/src/api/clipboard/fromClipboard/acceptedMIMETypes.js.map +1 -0
  47. package/dist/src/api/clipboard/fromClipboard/fileDropExtension.js +38 -0
  48. package/dist/src/api/clipboard/fromClipboard/fileDropExtension.js.map +1 -0
  49. package/dist/src/api/clipboard/fromClipboard/handleFileInsertion.js +109 -0
  50. package/dist/src/api/clipboard/fromClipboard/handleFileInsertion.js.map +1 -0
  51. package/dist/src/api/clipboard/fromClipboard/handleVSCodePaste.js +26 -0
  52. package/dist/src/api/clipboard/fromClipboard/handleVSCodePaste.js.map +1 -0
  53. package/dist/src/api/clipboard/fromClipboard/pasteExtension.js +57 -0
  54. package/dist/src/api/clipboard/fromClipboard/pasteExtension.js.map +1 -0
  55. package/dist/src/api/clipboard/toClipboard/copyExtension.js +132 -0
  56. package/dist/src/api/clipboard/toClipboard/copyExtension.js.map +1 -0
  57. package/dist/src/api/exporters/html/externalHTMLExporter.js +35 -0
  58. package/dist/src/api/exporters/html/externalHTMLExporter.js.map +1 -0
  59. package/dist/src/api/exporters/html/htmlConversion.test.js +72 -0
  60. package/dist/src/api/exporters/html/htmlConversion.test.js.map +1 -0
  61. package/dist/src/api/exporters/html/internalHTMLSerializer.js +21 -0
  62. package/dist/src/api/exporters/html/internalHTMLSerializer.js.map +1 -0
  63. package/dist/src/api/exporters/html/util/serializeBlocksExternalHTML.js +141 -0
  64. package/dist/src/api/exporters/html/util/serializeBlocksExternalHTML.js.map +1 -0
  65. package/dist/src/api/exporters/html/util/serializeBlocksInternalHTML.js +96 -0
  66. package/dist/src/api/exporters/html/util/serializeBlocksInternalHTML.js.map +1 -0
  67. package/dist/src/api/exporters/markdown/markdownExporter.js +31 -0
  68. package/dist/src/api/exporters/markdown/markdownExporter.js.map +1 -0
  69. package/dist/src/api/exporters/markdown/markdownExporter.test.js +57 -0
  70. package/dist/src/api/exporters/markdown/markdownExporter.test.js.map +1 -0
  71. package/dist/src/api/exporters/markdown/removeUnderlinesRehypePlugin.js +33 -0
  72. package/dist/src/api/exporters/markdown/removeUnderlinesRehypePlugin.js.map +1 -0
  73. package/dist/src/api/exporters/markdown/util/addSpacesToCheckboxesRehypePlugin.js +37 -0
  74. package/dist/src/api/exporters/markdown/util/addSpacesToCheckboxesRehypePlugin.js.map +1 -0
  75. package/dist/src/api/getBlockInfoFromPos.js +171 -0
  76. package/dist/src/api/getBlockInfoFromPos.js.map +1 -0
  77. package/dist/src/api/nodeConversions/blockToNode.js +197 -0
  78. package/dist/src/api/nodeConversions/blockToNode.js.map +1 -0
  79. package/dist/src/api/nodeConversions/fragmentToBlocks.js +50 -0
  80. package/dist/src/api/nodeConversions/fragmentToBlocks.js.map +1 -0
  81. package/dist/src/api/nodeConversions/nodeConversions.test.js +54 -0
  82. package/dist/src/api/nodeConversions/nodeConversions.test.js.map +1 -0
  83. package/dist/src/api/nodeConversions/nodeToBlock.js +316 -0
  84. package/dist/src/api/nodeConversions/nodeToBlock.js.map +1 -0
  85. package/dist/src/api/nodeUtil.js +28 -0
  86. package/dist/src/api/nodeUtil.js.map +1 -0
  87. package/dist/src/api/parsers/html/parseHTML.js +19 -0
  88. package/dist/src/api/parsers/html/parseHTML.js.map +1 -0
  89. package/dist/src/api/parsers/html/parseHTML.test.js +470 -0
  90. package/dist/src/api/parsers/html/parseHTML.test.js.map +1 -0
  91. package/dist/src/api/parsers/html/util/nestedLists.js +106 -0
  92. package/dist/src/api/parsers/html/util/nestedLists.js.map +1 -0
  93. package/dist/src/api/parsers/html/util/nestedLists.test.js +166 -0
  94. package/dist/src/api/parsers/html/util/nestedLists.test.js.map +1 -0
  95. package/dist/src/api/parsers/markdown/parseMarkdown.js +52 -0
  96. package/dist/src/api/parsers/markdown/parseMarkdown.js.map +1 -0
  97. package/dist/src/api/parsers/markdown/parseMarkdown.test.js +109 -0
  98. package/dist/src/api/parsers/markdown/parseMarkdown.test.js.map +1 -0
  99. package/dist/src/api/testUtil/cases/customBlocks.js +313 -0
  100. package/dist/src/api/testUtil/cases/customBlocks.js.map +1 -0
  101. package/dist/src/api/testUtil/cases/customInlineContent.js +91 -0
  102. package/dist/src/api/testUtil/cases/customInlineContent.js.map +1 -0
  103. package/dist/src/api/testUtil/cases/customStyles.js +83 -0
  104. package/dist/src/api/testUtil/cases/customStyles.js.map +1 -0
  105. package/dist/src/api/testUtil/cases/defaultSchema.js +673 -0
  106. package/dist/src/api/testUtil/cases/defaultSchema.js.map +1 -0
  107. package/dist/src/api/testUtil/index.js +2 -0
  108. package/dist/src/api/testUtil/index.js.map +1 -0
  109. package/dist/src/api/testUtil/partialBlockTestUtil.js +114 -0
  110. package/dist/src/api/testUtil/partialBlockTestUtil.js.map +1 -0
  111. package/dist/src/api/testUtil/paste.js +29 -0
  112. package/dist/src/api/testUtil/paste.js.map +1 -0
  113. package/dist/src/blocks/AudioBlockContent/AudioBlockContent.js +97 -0
  114. package/dist/src/blocks/AudioBlockContent/AudioBlockContent.js.map +1 -0
  115. package/dist/src/blocks/AudioBlockContent/audioBlockHelpers.js +5 -0
  116. package/dist/src/blocks/AudioBlockContent/audioBlockHelpers.js.map +1 -0
  117. package/dist/src/blocks/CodeBlockContent/CodeBlockContent.js +273 -0
  118. package/dist/src/blocks/CodeBlockContent/CodeBlockContent.js.map +1 -0
  119. package/dist/src/blocks/CodeBlockContent/defaultSupportedLanguages.js +90 -0
  120. package/dist/src/blocks/CodeBlockContent/defaultSupportedLanguages.js.map +1 -0
  121. package/dist/src/blocks/FileBlockContent/FileBlockContent.js +70 -0
  122. package/dist/src/blocks/FileBlockContent/FileBlockContent.js.map +1 -0
  123. package/dist/src/blocks/FileBlockContent/fileBlockHelpers.js +317 -0
  124. package/dist/src/blocks/FileBlockContent/fileBlockHelpers.js.map +1 -0
  125. package/dist/src/blocks/FileBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY.js +15 -0
  126. package/dist/src/blocks/FileBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY.js.map +1 -0
  127. package/dist/src/blocks/HeadingBlockContent/HeadingBlockContent.js +141 -0
  128. package/dist/src/blocks/HeadingBlockContent/HeadingBlockContent.js.map +1 -0
  129. package/dist/src/blocks/ImageBlockContent/ImageBlockContent.js +106 -0
  130. package/dist/src/blocks/ImageBlockContent/ImageBlockContent.js.map +1 -0
  131. package/dist/src/blocks/ImageBlockContent/imageBlockHelpers.js +6 -0
  132. package/dist/src/blocks/ImageBlockContent/imageBlockHelpers.js.map +1 -0
  133. package/dist/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.js +111 -0
  134. package/dist/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.js.map +1 -0
  135. package/dist/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.js +218 -0
  136. package/dist/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.js.map +1 -0
  137. package/dist/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.js +41 -0
  138. package/dist/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.js.map +1 -0
  139. package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.js +58 -0
  140. package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.js.map +1 -0
  141. package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.js +128 -0
  142. package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.js.map +1 -0
  143. package/dist/src/blocks/ParagraphBlockContent/ParagraphBlockContent.js +51 -0
  144. package/dist/src/blocks/ParagraphBlockContent/ParagraphBlockContent.js.map +1 -0
  145. package/dist/src/blocks/TableBlockContent/TableBlockContent.js +130 -0
  146. package/dist/src/blocks/TableBlockContent/TableBlockContent.js.map +1 -0
  147. package/dist/src/blocks/TableBlockContent/TableExtension.js +57 -0
  148. package/dist/src/blocks/TableBlockContent/TableExtension.js.map +1 -0
  149. package/dist/src/blocks/VideoBlockContent/VideoBlockContent.js +103 -0
  150. package/dist/src/blocks/VideoBlockContent/VideoBlockContent.js.map +1 -0
  151. package/dist/src/blocks/VideoBlockContent/videoBlockHelpers.js +6 -0
  152. package/dist/src/blocks/VideoBlockContent/videoBlockHelpers.js.map +1 -0
  153. package/dist/src/blocks/defaultBlockHelpers.js +50 -0
  154. package/dist/src/blocks/defaultBlockHelpers.js.map +1 -0
  155. package/dist/src/blocks/defaultBlockTypeGuards.js +40 -0
  156. package/dist/src/blocks/defaultBlockTypeGuards.js.map +1 -0
  157. package/dist/src/blocks/defaultBlocks.js +50 -0
  158. package/dist/src/blocks/defaultBlocks.js.map +1 -0
  159. package/dist/src/blocks/defaultProps.js +19 -0
  160. package/dist/src/blocks/defaultProps.js.map +1 -0
  161. package/dist/src/editor/BlockNoteEditor.js +750 -0
  162. package/dist/src/editor/BlockNoteEditor.js.map +1 -0
  163. package/dist/src/editor/BlockNoteEditor.test.js +65 -0
  164. package/dist/src/editor/BlockNoteEditor.test.js.map +1 -0
  165. package/dist/src/editor/BlockNoteExtensions.js +149 -0
  166. package/dist/src/editor/BlockNoteExtensions.js.map +1 -0
  167. package/dist/src/editor/BlockNoteSchema.js +38 -0
  168. package/dist/src/editor/BlockNoteSchema.js.map +1 -0
  169. package/dist/src/editor/BlockNoteTipTapEditor.js +169 -0
  170. package/dist/src/editor/BlockNoteTipTapEditor.js.map +1 -0
  171. package/dist/src/editor/cursorPositionTypes.js +2 -0
  172. package/dist/src/editor/cursorPositionTypes.js.map +1 -0
  173. package/dist/src/editor/defaultColors.js +77 -0
  174. package/dist/src/editor/defaultColors.js.map +1 -0
  175. package/dist/src/editor/selectionTypes.js +2 -0
  176. package/dist/src/editor/selectionTypes.js.map +1 -0
  177. package/dist/src/editor/transformPasted.js +79 -0
  178. package/dist/src/editor/transformPasted.js.map +1 -0
  179. package/dist/src/exporter/Exporter.js +36 -0
  180. package/dist/src/exporter/Exporter.js.map +1 -0
  181. package/dist/src/exporter/index.js +3 -0
  182. package/dist/src/exporter/index.js.map +1 -0
  183. package/dist/src/exporter/mapping.js +12 -0
  184. package/dist/src/exporter/mapping.js.map +1 -0
  185. package/dist/src/extensions/BackgroundColor/BackgroundColorExtension.js +30 -0
  186. package/dist/src/extensions/BackgroundColor/BackgroundColorExtension.js.map +1 -0
  187. package/dist/src/extensions/BackgroundColor/BackgroundColorMark.js +39 -0
  188. package/dist/src/extensions/BackgroundColor/BackgroundColorMark.js.map +1 -0
  189. package/dist/src/extensions/FilePanel/FilePanelPlugin.js +131 -0
  190. package/dist/src/extensions/FilePanel/FilePanelPlugin.js.map +1 -0
  191. package/dist/src/extensions/FormattingToolbar/FormattingToolbarPlugin.js +195 -0
  192. package/dist/src/extensions/FormattingToolbar/FormattingToolbarPlugin.js.map +1 -0
  193. package/dist/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.js +309 -0
  194. package/dist/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.js.map +1 -0
  195. package/dist/src/extensions/LinkToolbar/LinkToolbarPlugin.js +247 -0
  196. package/dist/src/extensions/LinkToolbar/LinkToolbarPlugin.js.map +1 -0
  197. package/dist/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.js +51 -0
  198. package/dist/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.js.map +1 -0
  199. package/dist/src/extensions/Placeholder/PlaceholderPlugin.js +81 -0
  200. package/dist/src/extensions/Placeholder/PlaceholderPlugin.js.map +1 -0
  201. package/dist/src/extensions/PreviousBlockType/PreviousBlockTypePlugin.js +183 -0
  202. package/dist/src/extensions/PreviousBlockType/PreviousBlockTypePlugin.js.map +1 -0
  203. package/dist/src/extensions/SideMenu/MultipleNodeSelection.js +68 -0
  204. package/dist/src/extensions/SideMenu/MultipleNodeSelection.js.map +1 -0
  205. package/dist/src/extensions/SideMenu/SideMenuPlugin.js +339 -0
  206. package/dist/src/extensions/SideMenu/SideMenuPlugin.js.map +1 -0
  207. package/dist/src/extensions/SideMenu/dragging.js +128 -0
  208. package/dist/src/extensions/SideMenu/dragging.js.map +1 -0
  209. package/dist/src/extensions/SuggestionMenu/DefaultGridSuggestionItem.js +2 -0
  210. package/dist/src/extensions/SuggestionMenu/DefaultGridSuggestionItem.js.map +1 -0
  211. package/dist/src/extensions/SuggestionMenu/DefaultSuggestionItem.js +2 -0
  212. package/dist/src/extensions/SuggestionMenu/DefaultSuggestionItem.js.map +1 -0
  213. package/dist/src/extensions/SuggestionMenu/SuggestionPlugin.js +245 -0
  214. package/dist/src/extensions/SuggestionMenu/SuggestionPlugin.js.map +1 -0
  215. package/dist/src/extensions/SuggestionMenu/getDefaultEmojiPickerItems.js +26 -0
  216. package/dist/src/extensions/SuggestionMenu/getDefaultEmojiPickerItems.js.map +1 -0
  217. package/dist/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.js +244 -0
  218. package/dist/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.js.map +1 -0
  219. package/dist/src/extensions/TableHandles/TableHandlesPlugin.js +553 -0
  220. package/dist/src/extensions/TableHandles/TableHandlesPlugin.js.map +1 -0
  221. package/dist/src/extensions/TextAlignment/TextAlignmentExtension.js +36 -0
  222. package/dist/src/extensions/TextAlignment/TextAlignmentExtension.js.map +1 -0
  223. package/dist/src/extensions/TextColor/TextColorExtension.js +29 -0
  224. package/dist/src/extensions/TextColor/TextColorExtension.js.map +1 -0
  225. package/dist/src/extensions/TextColor/TextColorMark.js +37 -0
  226. package/dist/src/extensions/TextColor/TextColorMark.js.map +1 -0
  227. package/dist/src/extensions/TrailingNode/TrailingNodeExtension.js +58 -0
  228. package/dist/src/extensions/TrailingNode/TrailingNodeExtension.js.map +1 -0
  229. package/dist/src/extensions/UniqueID/UniqueID.js +283 -0
  230. package/dist/src/extensions/UniqueID/UniqueID.js.map +1 -0
  231. package/dist/src/extensions/getDraggableBlockFromElement.js +13 -0
  232. package/dist/src/extensions/getDraggableBlockFromElement.js.map +1 -0
  233. package/dist/src/extensions-shared/UiElementPosition.js +2 -0
  234. package/dist/src/extensions-shared/UiElementPosition.js.map +1 -0
  235. package/dist/src/i18n/dictionary.js +4 -0
  236. package/dist/src/i18n/dictionary.js.map +1 -0
  237. package/dist/src/i18n/locales/ar.js +298 -0
  238. package/dist/src/i18n/locales/ar.js.map +1 -0
  239. package/dist/src/i18n/locales/de.js +313 -0
  240. package/dist/src/i18n/locales/de.js.map +1 -0
  241. package/dist/src/i18n/locales/en.js +314 -0
  242. package/dist/src/i18n/locales/en.js.map +1 -0
  243. package/dist/src/i18n/locales/es.js +312 -0
  244. package/dist/src/i18n/locales/es.js.map +1 -0
  245. package/dist/src/i18n/locales/fr.js +313 -0
  246. package/dist/src/i18n/locales/fr.js.map +1 -0
  247. package/dist/src/i18n/locales/hr.js +308 -0
  248. package/dist/src/i18n/locales/hr.js.map +1 -0
  249. package/dist/src/i18n/locales/index.js +16 -0
  250. package/dist/src/i18n/locales/index.js.map +1 -0
  251. package/dist/src/i18n/locales/is.js +305 -0
  252. package/dist/src/i18n/locales/is.js.map +1 -0
  253. package/dist/src/i18n/locales/ja.js +333 -0
  254. package/dist/src/i18n/locales/ja.js.map +1 -0
  255. package/dist/src/i18n/locales/ko.js +326 -0
  256. package/dist/src/i18n/locales/ko.js.map +1 -0
  257. package/dist/src/i18n/locales/nl.js +313 -0
  258. package/dist/src/i18n/locales/nl.js.map +1 -0
  259. package/dist/src/i18n/locales/pl.js +297 -0
  260. package/dist/src/i18n/locales/pl.js.map +1 -0
  261. package/dist/src/i18n/locales/pt.js +305 -0
  262. package/dist/src/i18n/locales/pt.js.map +1 -0
  263. package/dist/src/i18n/locales/ru.js +340 -0
  264. package/dist/src/i18n/locales/ru.js.map +1 -0
  265. package/dist/src/i18n/locales/vi.js +312 -0
  266. package/dist/src/i18n/locales/vi.js.map +1 -0
  267. package/dist/src/i18n/locales/zh.js +346 -0
  268. package/dist/src/i18n/locales/zh.js.map +1 -0
  269. package/dist/src/index.js +55 -0
  270. package/dist/src/index.js.map +1 -0
  271. package/dist/src/pm-nodes/BlockContainer.js +72 -0
  272. package/dist/src/pm-nodes/BlockContainer.js.map +1 -0
  273. package/dist/src/pm-nodes/BlockGroup.js +43 -0
  274. package/dist/src/pm-nodes/BlockGroup.js.map +1 -0
  275. package/dist/src/pm-nodes/Doc.js +7 -0
  276. package/dist/src/pm-nodes/Doc.js.map +1 -0
  277. package/dist/src/pm-nodes/index.js +4 -0
  278. package/dist/src/pm-nodes/index.js.map +1 -0
  279. package/dist/src/schema/blocks/createSpec.js +126 -0
  280. package/dist/src/schema/blocks/createSpec.js.map +1 -0
  281. package/dist/src/schema/blocks/internal.js +147 -0
  282. package/dist/src/schema/blocks/internal.js.map +1 -0
  283. package/dist/src/schema/blocks/types.js +2 -0
  284. package/dist/src/schema/blocks/types.js.map +1 -0
  285. package/dist/src/schema/index.js +11 -0
  286. package/dist/src/schema/index.js.map +1 -0
  287. package/dist/src/schema/inlineContent/createSpec.js +64 -0
  288. package/dist/src/schema/inlineContent/createSpec.js.map +1 -0
  289. package/dist/src/schema/inlineContent/internal.js +52 -0
  290. package/dist/src/schema/inlineContent/internal.js.map +1 -0
  291. package/dist/src/schema/inlineContent/types.js +10 -0
  292. package/dist/src/schema/inlineContent/types.js.map +1 -0
  293. package/dist/src/schema/propTypes.js +2 -0
  294. package/dist/src/schema/propTypes.js.map +1 -0
  295. package/dist/src/schema/styles/createSpec.js +48 -0
  296. package/dist/src/schema/styles/createSpec.js.map +1 -0
  297. package/dist/src/schema/styles/internal.js +53 -0
  298. package/dist/src/schema/styles/internal.js.map +1 -0
  299. package/dist/src/schema/styles/types.js +2 -0
  300. package/dist/src/schema/styles/types.js.map +1 -0
  301. package/dist/src/util/EventEmitter.js +33 -0
  302. package/dist/src/util/EventEmitter.js.map +1 -0
  303. package/dist/src/util/browser.js +17 -0
  304. package/dist/src/util/browser.js.map +1 -0
  305. package/dist/src/util/combineByGroup.js +20 -0
  306. package/dist/src/util/combineByGroup.js.map +1 -0
  307. package/dist/src/util/esmDependencies.js +35 -0
  308. package/dist/src/util/esmDependencies.js.map +1 -0
  309. package/dist/src/util/string.js +14 -0
  310. package/dist/src/util/string.js.map +1 -0
  311. package/dist/src/util/typescript.js +12 -0
  312. package/dist/src/util/typescript.js.map +1 -0
  313. package/dist/style.css +1 -1
  314. package/dist/tsconfig.tsbuildinfo +1 -0
  315. package/dist/webpack-stats.json +1 -1
  316. package/package.json +5 -5
  317. package/src/api/blockManipulation/commands/insertBlocks/insertBlocks.ts +2 -0
  318. package/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.ts +2 -2
  319. package/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.ts +104 -39
  320. package/src/api/blockManipulation/commands/moveBlock/moveBlock.ts +3 -5
  321. package/src/api/blockManipulation/commands/nestBlock/nestBlock.ts +100 -0
  322. package/src/api/blockManipulation/commands/removeBlocks/removeBlocks.ts +1 -1
  323. package/src/api/blockManipulation/commands/splitBlock/splitBlock.test.ts +8 -4
  324. package/src/api/blockManipulation/commands/splitBlock/splitBlock.ts +11 -7
  325. package/src/api/blockManipulation/commands/updateBlock/updateBlock.test.ts +5 -5
  326. package/src/api/blockManipulation/commands/updateBlock/updateBlock.ts +192 -107
  327. package/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.ts +48 -33
  328. package/src/api/clipboard/fromClipboard/handleFileInsertion.ts +1 -1
  329. package/src/api/clipboard/toClipboard/copyExtension.ts +1 -1
  330. package/src/api/exporters/html/htmlConversion.test.ts +1 -4
  331. package/src/api/exporters/html/util/serializeBlocksExternalHTML.ts +7 -1
  332. package/src/api/exporters/html/util/serializeBlocksInternalHTML.ts +56 -19
  333. package/src/api/exporters/markdown/markdownExporter.test.ts +1 -4
  334. package/src/api/getBlockInfoFromPos.ts +113 -58
  335. package/src/api/nodeConversions/blockToNode.ts +50 -25
  336. package/src/api/nodeConversions/fragmentToBlocks.ts +18 -0
  337. package/src/api/nodeConversions/nodeToBlock.ts +24 -21
  338. package/src/api/nodeUtil.ts +1 -1
  339. package/src/api/testUtil/partialBlockTestUtil.ts +15 -3
  340. package/src/blocks/AudioBlockContent/AudioBlockContent.ts +4 -2
  341. package/src/blocks/FileBlockContent/fileBlockHelpers.ts +5 -4
  342. package/src/blocks/HeadingBlockContent/HeadingBlockContent.ts +19 -31
  343. package/src/blocks/ImageBlockContent/ImageBlockContent.ts +4 -2
  344. package/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts +5 -9
  345. package/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.ts +6 -10
  346. package/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.ts +1 -1
  347. package/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.ts +11 -4
  348. package/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts +5 -9
  349. package/src/blocks/ParagraphBlockContent/ParagraphBlockContent.ts +4 -8
  350. package/src/blocks/VideoBlockContent/VideoBlockContent.ts +4 -2
  351. package/src/blocks/defaultBlockHelpers.ts +7 -2
  352. package/src/editor/Block.css +22 -1
  353. package/src/editor/BlockNoteEditor.test.ts +2 -2
  354. package/src/editor/BlockNoteEditor.ts +18 -21
  355. package/src/editor/BlockNoteExtensions.ts +2 -3
  356. package/src/editor/BlockNoteTipTapEditor.ts +8 -1
  357. package/src/editor/defaultColors.ts +77 -0
  358. package/src/editor/editor.css +10 -0
  359. package/src/editor/transformPasted.ts +6 -3
  360. package/src/exporter/Exporter.ts +101 -0
  361. package/src/exporter/index.ts +2 -0
  362. package/src/exporter/mapping.ts +75 -0
  363. package/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.ts +201 -48
  364. package/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.ts +1 -1
  365. package/src/extensions/SideMenu/SideMenuPlugin.ts +141 -52
  366. package/src/extensions/SideMenu/dragging.ts +3 -54
  367. package/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.ts +4 -6
  368. package/src/extensions/TableHandles/TableHandlesPlugin.ts +1 -1
  369. package/src/extensions/TrailingNode/TrailingNodeExtension.ts +1 -1
  370. package/src/extensions/getDraggableBlockFromElement.ts +19 -0
  371. package/src/i18n/locales/de.ts +5 -5
  372. package/src/i18n/locales/pt.ts +5 -5
  373. package/src/index.ts +9 -5
  374. package/src/pm-nodes/BlockContainer.ts +1 -1
  375. package/src/pm-nodes/BlockGroup.ts +2 -2
  376. package/src/pm-nodes/README.md +127 -28
  377. package/src/schema/blocks/createSpec.ts +4 -1
  378. package/src/schema/blocks/internal.ts +12 -2
  379. package/src/schema/blocks/types.ts +1 -1
  380. package/src/util/combineByGroup.ts +25 -0
  381. package/types/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.d.ts +22 -2
  382. package/types/src/api/blockManipulation/commands/nestBlock/nestBlock.d.ts +5 -0
  383. package/types/src/api/getBlockInfoFromPos.d.ts +55 -5
  384. package/types/src/api/nodeConversions/blockToNode.d.ts +1 -1
  385. package/types/src/api/nodeConversions/nodeToBlock.d.ts +3 -1
  386. package/types/src/api/testUtil/partialBlockTestUtil.d.ts +2 -1
  387. package/types/src/blocks/AudioBlockContent/AudioBlockContent.d.ts +1 -0
  388. package/types/src/blocks/FileBlockContent/fileBlockHelpers.d.ts +1 -0
  389. package/types/src/blocks/ImageBlockContent/ImageBlockContent.d.ts +1 -0
  390. package/types/src/blocks/VideoBlockContent/VideoBlockContent.d.ts +1 -0
  391. package/types/src/editor/BlockNoteEditor.d.ts +4 -3
  392. package/types/src/editor/BlockNoteTipTapEditor.d.ts +1 -0
  393. package/types/src/editor/defaultColors.d.ts +76 -0
  394. package/types/src/exporter/Exporter.d.ts +43 -0
  395. package/types/src/exporter/index.d.ts +2 -0
  396. package/types/src/exporter/mapping.d.ts +30 -0
  397. package/types/src/extensions/SideMenu/SideMenuPlugin.d.ts +2 -1
  398. package/types/src/extensions/SideMenu/dragging.d.ts +1 -6
  399. package/types/src/extensions/getDraggableBlockFromElement.d.ts +5 -0
  400. package/types/src/index.d.ts +9 -5
  401. package/types/src/schema/blocks/createSpec.d.ts +1 -1
  402. package/types/src/schema/blocks/internal.d.ts +2 -2
  403. package/types/src/schema/blocks/types.d.ts +1 -1
  404. package/types/src/util/combineByGroup.d.ts +9 -0
  405. package/dist/angular-html-HQGguTAE.js +0 -33
  406. package/dist/angular-html-HQGguTAE.js.map +0 -1
  407. package/dist/angular-ts-q9PqJiJb.js +0 -22
  408. package/dist/angular-ts-q9PqJiJb.js.map +0 -1
  409. package/dist/astro-0iWgpDaK.js +0 -17
  410. package/dist/astro-0iWgpDaK.js.map +0 -1
  411. package/dist/blade-C3Z8AhvY.js +0 -19
  412. package/dist/blade-C3Z8AhvY.js.map +0 -1
  413. package/dist/c-TKJGJdXV.js +0 -7
  414. package/dist/c-TKJGJdXV.js.map +0 -1
  415. package/dist/coffee-CN_y6cG3.js +0 -9
  416. package/dist/coffee-CN_y6cG3.js.map +0 -1
  417. package/dist/cpp-Be_e67JE.js +0 -19
  418. package/dist/cpp-Be_e67JE.js.map +0 -1
  419. package/dist/css-DHLSoXzW.js +0 -7
  420. package/dist/css-DHLSoXzW.js.map +0 -1
  421. package/dist/glsl-8qSUIm5B.js +0 -9
  422. package/dist/glsl-8qSUIm5B.js.map +0 -1
  423. package/dist/graphql-D7_Dk2ma.js +0 -15
  424. package/dist/graphql-D7_Dk2ma.js.map +0 -1
  425. package/dist/haml-S3dmcfEW.js +0 -11
  426. package/dist/haml-S3dmcfEW.js.map +0 -1
  427. package/dist/handlebars-DaIrqVg3.js +0 -15
  428. package/dist/handlebars-DaIrqVg3.js.map +0 -1
  429. package/dist/html-Bx3A18fV.js +0 -11
  430. package/dist/html-Bx3A18fV.js.map +0 -1
  431. package/dist/html-derivative-Cf3KTZBS.js +0 -9
  432. package/dist/html-derivative-Cf3KTZBS.js.map +0 -1
  433. package/dist/http-BphR83YX.js +0 -15
  434. package/dist/http-BphR83YX.js.map +0 -1
  435. package/dist/imba-CmP25v0O.js +0 -9
  436. package/dist/imba-CmP25v0O.js.map +0 -1
  437. package/dist/java-Dg4kxH6C.js +0 -7
  438. package/dist/java-Dg4kxH6C.js.map +0 -1
  439. package/dist/javascript-CipAzIn1.js +0 -7
  440. package/dist/javascript-CipAzIn1.js.map +0 -1
  441. package/dist/jinja-tioldiz6.js +0 -12
  442. package/dist/jinja-tioldiz6.js.map +0 -1
  443. package/dist/jison-DWJFEE_I.js +0 -9
  444. package/dist/jison-DWJFEE_I.js.map +0 -1
  445. package/dist/json-_04EL6MS.js +0 -7
  446. package/dist/json-_04EL6MS.js.map +0 -1
  447. package/dist/json5-Dwmp5XFI.js +0 -7
  448. package/dist/json5-Dwmp5XFI.js.map +0 -1
  449. package/dist/jsonc-LqD5auy0.js +0 -7
  450. package/dist/jsonc-LqD5auy0.js.map +0 -1
  451. package/dist/jsonl-B4yVuYQH.js +0 -7
  452. package/dist/jsonl-B4yVuYQH.js.map +0 -1
  453. package/dist/jsx-Mg4WaD5k.js +0 -7
  454. package/dist/jsx-Mg4WaD5k.js.map +0 -1
  455. package/dist/julia-CWi-ZdpN.js +0 -17
  456. package/dist/julia-CWi-ZdpN.js.map +0 -1
  457. package/dist/less-BBvTHIGe.js +0 -7
  458. package/dist/less-BBvTHIGe.js.map +0 -1
  459. package/dist/markdown-DAXqtk9a.js +0 -7
  460. package/dist/markdown-DAXqtk9a.js.map +0 -1
  461. package/dist/marko-0aaNgUGV.js +0 -15
  462. package/dist/marko-0aaNgUGV.js.map +0 -1
  463. package/dist/mdc-hXJ2B4O0.js +0 -13
  464. package/dist/mdc-hXJ2B4O0.js.map +0 -1
  465. package/dist/mdx-CSCKbb_f.js +0 -7
  466. package/dist/mdx-CSCKbb_f.js.map +0 -1
  467. package/dist/php-B_-4RJ09.js +0 -19
  468. package/dist/php-B_-4RJ09.js.map +0 -1
  469. package/dist/postcss-SJfTvo_B.js +0 -7
  470. package/dist/postcss-SJfTvo_B.js.map +0 -1
  471. package/dist/pug-3q2tx0nf.js +0 -13
  472. package/dist/pug-3q2tx0nf.js.map +0 -1
  473. package/dist/python-Dpup1-fE.js +0 -7
  474. package/dist/python-Dpup1-fE.js.map +0 -1
  475. package/dist/r-Chyv38Fv.js +0 -7
  476. package/dist/r-Chyv38Fv.js.map +0 -1
  477. package/dist/regexp-BF0hfxNW.js +0 -7
  478. package/dist/regexp-BF0hfxNW.js.map +0 -1
  479. package/dist/sass-p2RMoqDT.js +0 -7
  480. package/dist/sass-p2RMoqDT.js.map +0 -1
  481. package/dist/scss-DmlHSoOY.js +0 -9
  482. package/dist/scss-DmlHSoOY.js.map +0 -1
  483. package/dist/shellscript-CZpPN8_x.js +0 -7
  484. package/dist/shellscript-CZpPN8_x.js.map +0 -1
  485. package/dist/sql-DtlkUz2m.js +0 -7
  486. package/dist/sql-DtlkUz2m.js.map +0 -1
  487. package/dist/stylus-DEr8eSLm.js +0 -7
  488. package/dist/stylus-DEr8eSLm.js.map +0 -1
  489. package/dist/svelte-BRIJF62h.js +0 -15
  490. package/dist/svelte-BRIJF62h.js.map +0 -1
  491. package/dist/ts-tags-qkUtuI0N.js +0 -42
  492. package/dist/ts-tags-qkUtuI0N.js.map +0 -1
  493. package/dist/tsx-DTfbgJxi.js +0 -7
  494. package/dist/tsx-DTfbgJxi.js.map +0 -1
  495. package/dist/typescript-CCd4aQHh.js +0 -7
  496. package/dist/typescript-CCd4aQHh.js.map +0 -1
  497. package/dist/vue-B3TdbERm.js +0 -32
  498. package/dist/vue-B3TdbERm.js.map +0 -1
  499. package/dist/vue-html-BGmTBZk0.js +0 -11
  500. package/dist/vue-html-BGmTBZk0.js.map +0 -1
  501. package/dist/wasm-VDIDph3E.js +0 -7
  502. package/dist/wasm-VDIDph3E.js.map +0 -1
  503. package/dist/wgsl-2np_U3Z8.js +0 -7
  504. package/dist/wgsl-2np_U3Z8.js.map +0 -1
  505. package/dist/xml-CNyphW9R.js +0 -9
  506. package/dist/xml-CNyphW9R.js.map +0 -1
  507. package/dist/yaml-DxFiVFcM.js +0 -7
  508. package/dist/yaml-DxFiVFcM.js.map +0 -1
@@ -0,0 +1,470 @@
1
+ import * as pmView from "prosemirror-view";
2
+ import { describe, expect, it } from "vitest";
3
+ import { BlockNoteEditor } from "../../../index.js";
4
+ import { nestedListsToBlockNoteStructure } from "./util/nestedLists.js";
5
+ async function parseHTMLAndCompareSnapshots(html, snapshotName) {
6
+ const editor = BlockNoteEditor.create();
7
+ const div = document.createElement("div");
8
+ editor.mount(div);
9
+ const blocks = await editor.tryParseHTMLToBlocks(html);
10
+ const snapshotPath = "./__snapshots__/" + snapshotName + ".json";
11
+ expect(JSON.stringify(blocks, undefined, 2)).toMatchFileSnapshot(snapshotPath);
12
+ // Now, we also want to test actually pasting in the editor, and not just calling
13
+ // tryParseHTMLToBlocks directly.
14
+ // The reason is that the prosemirror logic for pasting can be a bit different, because
15
+ // it's related to the context of where the user is pasting exactly (selection)
16
+ //
17
+ // The internal difference come that in tryParseHTMLToBlocks, we use DOMParser.parse,
18
+ // while when pasting, Prosemirror uses DOMParser.parseSlice, and then tries to fit the
19
+ // slice in the document. This fitting might change the structure / interpretation of the pasted blocks
20
+ // Simulate a paste event (this uses DOMParser.parseSlice internally)
21
+ window.__TEST_OPTIONS.mockID = 0; // reset id counter
22
+ const htmlNode = nestedListsToBlockNoteStructure(html);
23
+ const slice = pmView.__parseFromClipboard(editor.prosemirrorView, "", htmlNode.innerHTML, false, editor._tiptapEditor.state.selection.$from);
24
+ editor.dispatch(editor._tiptapEditor.state.tr.replaceSelection(slice));
25
+ // alternative paste simulation doesn't work in a non-browser vitest env
26
+ // editor._tiptapEditor.view.pasteHTML(html, {
27
+ // preventDefault: () => {
28
+ // // noop
29
+ // },
30
+ // clipboardData: {
31
+ // types: ["text/html"],
32
+ // getData: () => html,
33
+ // },
34
+ // } as any);
35
+ const pastedBlocks = editor.document;
36
+ pastedBlocks.pop(); // trailing paragraph
37
+ expect(pastedBlocks).toStrictEqual(blocks);
38
+ editor.mount(undefined);
39
+ }
40
+ describe("Parse HTML", () => {
41
+ it("Parse basic block types", async () => {
42
+ const html = `<h1>Heading 1</h1>
43
+ <h2>Heading 2</h2>
44
+ <h3>Heading 3</h3>
45
+ <p>Paragraph</p>
46
+ <figure><img src="exampleURL" /><figcaption>Image Caption</figcaption></figure>
47
+ <p>None <strong>Bold </strong><em>Italic </em><u>Underline </u><s>Strikethrough </s><strong><em><s><u>All</u></s></em></strong></p>`;
48
+ await parseHTMLAndCompareSnapshots(html, "parse-basic-block-types");
49
+ });
50
+ it("list test", async () => {
51
+ const html = `<ul>
52
+ <li>First</li>
53
+ <li>Second</li>
54
+ <li>Third</li>
55
+ <li>
56
+ <input type="checkbox">
57
+ Fourth
58
+ </li>
59
+ <li>
60
+ <input type="checkbox">
61
+ Fifth
62
+ </li>
63
+ <li>Five Parent
64
+ <ul>
65
+ <li>Child 1</li>
66
+ <li>Child 2</li>
67
+ <li>
68
+ <input type="checkbox">
69
+ Child 3
70
+ </li>
71
+ <li>
72
+ <input type="checkbox">
73
+ Child 4
74
+ </li>
75
+ </ul>
76
+ </li>
77
+ </ul>`;
78
+ await parseHTMLAndCompareSnapshots(html, "list-test");
79
+ });
80
+ it("Parse nested lists", async () => {
81
+ const html = `<ul>
82
+ <li>Bullet List Item</li>
83
+ <li>Bullet List Item
84
+ <ul>
85
+ <li>Nested Bullet List Item</li>
86
+ <li>Nested Bullet List Item</li>
87
+ </ul>
88
+ </li>
89
+ <li>Bullet List Item</li>
90
+ </ul>
91
+ <ol>
92
+ <li>Numbered List Item</li>
93
+ <li>Numbered List Item
94
+ <ol>
95
+ <li>Nested Numbered List Item</li>
96
+ <li>Nested Numbered List Item</li>
97
+ </ol>
98
+ </li>
99
+ <li>Numbered List Item</li>
100
+ </ol>
101
+ <ul>
102
+ <li>
103
+ <input type="checkbox">
104
+ Check List Item
105
+ </li>
106
+ <li>
107
+ <input type="checkbox">
108
+ Check List Item
109
+ <ul>
110
+ <li>
111
+ <input type="checkbox">
112
+ Nested Check List Item
113
+ </li>
114
+ <li>
115
+ <input type="checkbox">
116
+ Nested Check List Item
117
+ </li>
118
+ </ul>
119
+ </li>
120
+ <li>
121
+ <input type="checkbox">
122
+ Nested Check List Item
123
+ </li>
124
+ </ul>`;
125
+ await parseHTMLAndCompareSnapshots(html, "parse-nested-lists");
126
+ });
127
+ it("Parse nested lists with paragraphs", async () => {
128
+ const html = `<ul>
129
+ <li>
130
+ <p>Bullet List Item</p>
131
+ </li>
132
+ <li>
133
+ <p>Bullet List Item</p>
134
+ <ul>
135
+ <li>
136
+ <p>Nested Bullet List Item</p>
137
+ </li>
138
+ <li>
139
+ <p>Nested Bullet List Item</p>
140
+ </li>
141
+ </ul>
142
+ </li>
143
+ <li>
144
+ <p>Bullet List Item</p>
145
+ </li>
146
+ </ul>
147
+ <ol>
148
+ <li>
149
+ <p>Numbered List Item</p>
150
+ </li>
151
+ <li>
152
+ <p>Numbered List Item</p>
153
+ <ol>
154
+ <li>
155
+ <p>Nested Numbered List Item</p>
156
+ </li>
157
+ <li>
158
+ <p>Nested Numbered List Item</p>
159
+ </li>
160
+ </ol>
161
+ </li>
162
+ <li>
163
+ <p>Numbered List Item</p>
164
+ </li>
165
+ </ol>
166
+ <ul>
167
+ <li>
168
+ <input type="checkbox">
169
+ <p>Checked List Item</p>
170
+ </li>
171
+ <li>
172
+ <input type="checkbox">
173
+ <p>Checked List Item</p>
174
+ <ul>
175
+ <li>
176
+ <input type="checkbox">
177
+ <p>Nested Checked List Item</p>
178
+ </li>
179
+ <li>
180
+ <label><input type="checkbox"></label>
181
+ <p>Nested Checked List Item</p>
182
+ </li>
183
+ </ul>
184
+ </li>
185
+ <li>
186
+ <input type="checkbox">
187
+ <p>Checked List Item</p>
188
+ </li>
189
+ </ul>`;
190
+ await parseHTMLAndCompareSnapshots(html, "parse-nested-lists-with-paragraphs");
191
+ });
192
+ it("Parse mixed nested lists", async () => {
193
+ const html = `<ul>
194
+ <li>Bullet List Item</li>
195
+ <li>Bullet List Item
196
+ <ol>
197
+ <li>Nested Numbered List Item</li>
198
+ <li>Nested Numbered List Item</li>
199
+ </ol>
200
+ </li>
201
+ <li>Bullet List Item</li>
202
+ </ul>
203
+ <ol>
204
+ <li>Numbered List Item</li>
205
+ <li>Numbered List Item
206
+ <ul>
207
+ <li>
208
+ <input type="checkbox" checked>
209
+ Nested Check List Item
210
+ </li>
211
+ <li>
212
+ <input type="checkbox">
213
+ Nested Check List Item
214
+ </li>
215
+ </ul>
216
+ </li>
217
+ <li>Numbered List Item</li>
218
+ </ol>
219
+ <ul>
220
+ <li>
221
+ <input type="checkbox" checked>
222
+ Check List Item
223
+ </li>
224
+ <li>
225
+ <input type="checkbox">
226
+ Check List Item
227
+ <ul>
228
+ <li>Nested Bullet List Item</li>
229
+ <li>Nested Bullet List Item</li>
230
+ </ul>
231
+ </li>
232
+ <li>
233
+ <input type="checkbox" checked>
234
+ Nested Check List Item
235
+ </li>
236
+ </ul>`;
237
+ await parseHTMLAndCompareSnapshots(html, "parse-mixed-nested-lists");
238
+ });
239
+ it("Parse divs", async () => {
240
+ const html = `<div>Single Div</div>
241
+ <div>
242
+ Div
243
+ <div>Nested Div</div>
244
+ <div>Nested Div</div>
245
+ </div>
246
+ <div>Single Div 2</div>
247
+ <div>
248
+ <div>Nested Div</div>
249
+ <div>Nested Div</div>
250
+ </div>`;
251
+ await parseHTMLAndCompareSnapshots(html, "parse-divs");
252
+ });
253
+ it("Parse two divs", async () => {
254
+ const html = `<div>Single Div</div><div>second Div</div>`;
255
+ await parseHTMLAndCompareSnapshots(html, "parse-two-divs");
256
+ });
257
+ it("Parse image in paragraph", async () => {
258
+ const html = `<p>
259
+ <img src="exampleURL">
260
+ </p>`;
261
+ await parseHTMLAndCompareSnapshots(html, "parse-image-in-paragraph");
262
+ });
263
+ it("Parse fake image caption", async () => {
264
+ const html = `<div>
265
+ <img src="exampleURL">
266
+ <p>Image Caption</p>
267
+ </div>`;
268
+ await parseHTMLAndCompareSnapshots(html, "parse-fake-image-caption");
269
+ });
270
+ // TODO: this one fails
271
+ it.skip("Parse deep nested content", async () => {
272
+ const html = `<div>
273
+ Outer 1 Div Before
274
+ <div>
275
+ Outer 2 Div Before
276
+ <div>
277
+ Outer 3 Div Before
278
+ <div>
279
+ Outer 4 Div Before
280
+ <h1>Heading 1</h1>
281
+ <h2>Heading 2</h2>
282
+ <h3>Heading 3</h3>
283
+ <p>Paragraph</p>
284
+ <figure><img src="exampleURL"><figcaption>Image Caption</figcaption></figure>
285
+ <p><strong>Bold</strong> <em>Italic</em> <u>Underline</u> <s>Strikethrough</s> <strong><em><s><u>All</u></s></em></strong></p>
286
+ Outer 4 Div After
287
+ </div>
288
+ Outer 3 Div After
289
+ </div>
290
+ Outer 2 Div After
291
+ </div>
292
+ Outer 1 Div After
293
+ </div>`;
294
+ await parseHTMLAndCompareSnapshots(html, "parse-deep-nested-content");
295
+ });
296
+ it("Parse div with inline content and nested blocks", async () => {
297
+ const html = `<div>
298
+ None <strong>Bold </strong><em>Italic </em><u>Underline </u><s>Strikethrough </s><strong><em><s><u>All</u></s></em></strong>
299
+ <div>Nested Div</div>
300
+ <p>Nested Paragraph</p>
301
+ </div>`;
302
+ await parseHTMLAndCompareSnapshots(html, "parse-div-with-inline-content");
303
+ });
304
+ it("Parse Notion HTML", async () => {
305
+ // A few notes on Notion output HTML:
306
+ // - Does not preserve text/background colors
307
+ // - Does not preserve non-list-item block nesting
308
+ // - Hard breaks are represented using white space, not `<br>` elements
309
+ // - Images are converted to links with a "!" at the start
310
+ // - Cells in first row of a table are converted to `th` elements, regardless
311
+ // of if the row is set as a header row
312
+ const html = `<meta charset='utf-8'><h1>Heading 1</h1>
313
+ <h2>Heading 2</h2>
314
+ <h3>Heading 3</h3>
315
+ <p>Paragraph 1</p>
316
+ <p>Nested Paragraph 1</p>
317
+ <p>Nested Paragraph 2</p>
318
+ <p>Paragraph
319
+ With Hard Break</p>
320
+ <p><strong>Bold</strong> <em>Italic</em> Underline <s>Strikethrough</s> <em><strong><s>All</s></strong></em></p>
321
+ <ul>
322
+ <li>Bullet List Item 1
323
+ <ul>
324
+ <li>Nested Bullet List Item 1
325
+ <ol>
326
+ <li>Nested Numbered List Item 1</li>
327
+ <li>Nested Numbered List Item 2</li>
328
+ </ol>
329
+ </li>
330
+ <li>Nested Bullet List Item 2</li>
331
+ </ul>
332
+ </li>
333
+ <li>Bullet List Item 2</li>
334
+ </ul>
335
+ <ol>
336
+ <li>Numbered List Item 1</li>
337
+ <li>Numbered List Item 2</li>
338
+ </ol>
339
+ <p>Background Color Paragraph</p>
340
+ <p>!<a href="https://www.pulsecarshalton.co.uk/wp-content/uploads/2016/08/jk-placeholder-image.jpg">https://www.pulsecarshalton.co.uk/wp-content/uploads/2016/08/jk-placeholder-image.jpg</a></p>
341
+ <table>
342
+ <thead>
343
+ <tr>
344
+ <th>Cell 1</th>
345
+ <th>Cell 2</th>
346
+ <th>Cell 3</th>
347
+ </tr>
348
+ </thead>
349
+ <tbody>
350
+ <tr>
351
+ <td>Cell 4</td>
352
+ <td>Cell 5</td>
353
+ <td>Cell 6</td>
354
+ </tr>
355
+ <tr>
356
+ <td>Cell 7</td>
357
+ <td>Cell 8</td>
358
+ <td>Cell 9</td>
359
+ </tr>
360
+ </tbody>
361
+ </table>
362
+ <p>Paragraph</p>
363
+ <!-- notionvc: 7cb7968f-b969-4795-af7a-d41b5481c675 -->`;
364
+ await parseHTMLAndCompareSnapshots(html, "parse-notion-html");
365
+ });
366
+ // Currently breaking, seems related to parsing `</br>` elements
367
+ it.skip("Parse Google Docs HTML", async () => {
368
+ // A few notes on Google Docs output HTML:
369
+ // - All inline markup is represented as `<span>` elements with inline
370
+ // styles (bold, italic, etc.)
371
+ // - The nested list structure is not valid, i.e. `<ul/ol>` elements are not
372
+ // placed within `<li>` elements
373
+ // - Images are wrapped in two spans and a paragraph
374
+ // - Everything is nested within a `<b>` element
375
+ const html = `<meta charset='utf-8'>
376
+ <meta charset="utf-8">
377
+ <b style="font-weight:normal;" id="docs-internal-guid-fdf86189-7fff-f50a-2bef-c048469db8a9">
378
+ <h1 dir="ltr" style="line-height:1.38;margin-left: 18pt;text-indent: -18pt;margin-top:24pt;margin-bottom:6pt;padding:0pt 0pt 0pt 18pt;"><span style="font-size:23pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Heading 1</span></h1>
379
+ <h2 dir="ltr" style="line-height:1.38;margin-left: 18pt;text-indent: -18pt;margin-top:18pt;margin-bottom:4pt;padding:0pt 0pt 0pt 18pt;"><span style="font-size:17pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Heading 2</span></h2>
380
+ <h3 dir="ltr" style="line-height:1.38;margin-left: 18pt;text-indent: -18pt;margin-top:14pt;margin-bottom:4pt;padding:0pt 0pt 0pt 18pt;"><span style="font-size:13pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Heading 3</span></h3>
381
+ <p dir="ltr" style="line-height:1.38;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Paragraph 1</span></p>
382
+ <p dir="ltr" style="line-height:1.38;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Paragraph 2</span></p>
383
+ <p dir="ltr" style="line-height:1.38;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Paragraph 3</span></p>
384
+ <p dir="ltr" style="line-height:1.38;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Paragraph With </span><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><br /></span><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Hard Break</span></p>
385
+ <p dir="ltr" style="line-height:1.38;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Bold</span><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Italic</span><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> Underline </span><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:line-through;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Strikethrough</span><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> </span><span style="font-size:11pt;font-family:Arial,sans-serif;color:#ff0000;background-color:transparent;font-weight:700;font-style:italic;font-variant:normal;text-decoration:line-through;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">All</span></p>
386
+ <ul style="margin-top:0;margin-bottom:0;padding-inline-start:48px;">
387
+ <li dir="ltr" style="list-style-type:disc;font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;" aria-level="1">
388
+ <p dir="ltr" style="line-height:1.38;margin-top:12pt;margin-bottom:0pt;" role="presentation"><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Bullet List Item 1</span></p>
389
+ </li>
390
+ <ul style="margin-top:0;margin-bottom:0;padding-inline-start:48px;">
391
+ <li dir="ltr" style="list-style-type:circle;font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;" aria-level="2">
392
+ <p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;" role="presentation"><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Nested Bullet List Item 1</span></p>
393
+ </li>
394
+ <ol style="margin-top:0;margin-bottom:0;padding-inline-start:48px;">
395
+ <li dir="ltr" style="list-style-type:decimal;font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;" aria-level="3">
396
+ <p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;" role="presentation"><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Nested Numbered List Item 1</span></p>
397
+ </li>
398
+ <li dir="ltr" style="list-style-type:decimal;font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;" aria-level="3">
399
+ <p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;" role="presentation"><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Nested Numbered List Item 2</span></p>
400
+ </li>
401
+ </ol>
402
+ <li dir="ltr" style="list-style-type:circle;font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;" aria-level="2">
403
+ <p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;" role="presentation"><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Nested Bullet List Item 2</span></p>
404
+ </li>
405
+ </ul>
406
+ <li dir="ltr" style="list-style-type:disc;font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;" aria-level="1">
407
+ <p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;" role="presentation"><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Bullet List Item 2</span></p>
408
+ </li>
409
+ </ul>
410
+ <ol style="margin-top:0;margin-bottom:0;padding-inline-start:48px;">
411
+ <li dir="ltr" style="list-style-type:decimal;font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;" aria-level="1">
412
+ <p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;" role="presentation"><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Numbered List Item 1</span></p>
413
+ </li>
414
+ <li dir="ltr" style="list-style-type:decimal;font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;" aria-level="1">
415
+ <p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:12pt;" role="presentation"><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Numbered List Item 2</span></p>
416
+ </li>
417
+ </ol>
418
+ <p dir="ltr" style="line-height:1.38;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"><span style="border:none;display:inline-block;overflow:hidden;width:447px;height:301px;"><img src="https://lh7-us.googleusercontent.com/SGyYp6hfLvNkli62NKFJB6NQz-fNa2Sjy8QxfUuqipW--qCCXmCz-dJmeZUGaDXIF9TEZHzbhNJsw4_w-B09eaFOn0oUChKsrSt3cwAIFu6d4SoSjHTR_DRTPr415_P7an7Lue-EwlUcVBk1WCzcoVQ" width="447" height="301" style="margin-left:0px;margin-top:0px;" /></span></span></p>
419
+ <br />
420
+ <div dir="ltr" style="margin-left:0pt;" align="left">
421
+ <table style="border:none;border-collapse:collapse;table-layout:fixed;width:468pt">
422
+ <colgroup>
423
+ <col />
424
+ <col />
425
+ <col />
426
+ </colgroup>
427
+ <tbody>
428
+ <tr style="height:0pt">
429
+ <td style="border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt;overflow:hidden;overflow-wrap:break-word;">
430
+ <p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Cell 1</span></p>
431
+ </td>
432
+ <td style="border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt;overflow:hidden;overflow-wrap:break-word;">
433
+ <p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Cell 2</span></p>
434
+ </td>
435
+ <td style="border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt;overflow:hidden;overflow-wrap:break-word;">
436
+ <p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Cell 3</span></p>
437
+ </td>
438
+ </tr>
439
+ <tr style="height:0pt">
440
+ <td style="border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt;overflow:hidden;overflow-wrap:break-word;">
441
+ <p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Cell 4</span></p>
442
+ </td>
443
+ <td style="border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt;overflow:hidden;overflow-wrap:break-word;">
444
+ <p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Cell 5</span></p>
445
+ </td>
446
+ <td style="border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt;overflow:hidden;overflow-wrap:break-word;">
447
+ <p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Cell 6</span></p>
448
+ </td>
449
+ </tr>
450
+ <tr style="height:0pt">
451
+ <td style="border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt;overflow:hidden;overflow-wrap:break-word;">
452
+ <p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Cell 7</span></p>
453
+ </td>
454
+ <td style="border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt;overflow:hidden;overflow-wrap:break-word;">
455
+ <p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Cell 8</span></p>
456
+ </td>
457
+ <td style="border-left:solid #000000 1pt;border-right:solid #000000 1pt;border-bottom:solid #000000 1pt;border-top:solid #000000 1pt;vertical-align:top;padding:5pt 5pt 5pt 5pt;overflow:hidden;overflow-wrap:break-word;">
458
+ <p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Cell 9</span></p>
459
+ </td>
460
+ </tr>
461
+ </tbody>
462
+ </table>
463
+ </div>
464
+ <p dir="ltr" style="line-height:1.38;margin-top:12pt;margin-bottom:12pt;"><span style="font-size:11pt;font-family:Arial,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Paragraph</span></p>
465
+ </b>
466
+ <br class="Apple-interchange-newline">`;
467
+ await parseHTMLAndCompareSnapshots(html, "parse-google-docs-html");
468
+ });
469
+ });
470
+ //# sourceMappingURL=parseHTML.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseHTML.test.js","sourceRoot":"","sources":["../../../../../src/api/parsers/html/parseHTML.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ function getChildIndex(node) {
2
+ return Array.prototype.indexOf.call(node.parentElement.childNodes, node);
3
+ }
4
+ function isWhitespaceNode(node) {
5
+ return node.nodeType === 3 && !/\S/.test(node.nodeValue || "");
6
+ }
7
+ /**
8
+ * Step 1, Turns:
9
+ *
10
+ * <ul>
11
+ * <li>item</li>
12
+ * <li>
13
+ * <ul>
14
+ * <li>...</li>
15
+ * <li>...</li>
16
+ * </ul>
17
+ * </li>
18
+ *
19
+ * Into:
20
+ * <ul>
21
+ * <li>item</li>
22
+ * <ul>
23
+ * <li>...</li>
24
+ * <li>...</li>
25
+ * </ul>
26
+ * </ul>
27
+ *
28
+ */
29
+ function liftNestedListsToParent(element) {
30
+ element.querySelectorAll("li > ul, li > ol").forEach((list) => {
31
+ const index = getChildIndex(list);
32
+ const parentListItem = list.parentElement;
33
+ const siblingsAfter = Array.from(parentListItem.childNodes).slice(index + 1);
34
+ list.remove();
35
+ siblingsAfter.forEach((sibling) => {
36
+ sibling.remove();
37
+ });
38
+ parentListItem.insertAdjacentElement("afterend", list);
39
+ siblingsAfter.reverse().forEach((sibling) => {
40
+ if (isWhitespaceNode(sibling)) {
41
+ return;
42
+ }
43
+ const siblingContainer = document.createElement("li");
44
+ siblingContainer.append(sibling);
45
+ list.insertAdjacentElement("afterend", siblingContainer);
46
+ });
47
+ if (parentListItem.childNodes.length === 0) {
48
+ parentListItem.remove();
49
+ }
50
+ });
51
+ }
52
+ /**
53
+ * Step 2, Turns (output of liftNestedListsToParent):
54
+ *
55
+ * <li>item</li>
56
+ * <ul>
57
+ * <li>...</li>
58
+ * <li>...</li>
59
+ * </ul>
60
+ *
61
+ * Into:
62
+ * <div>
63
+ * <li>item</li>
64
+ * <div data-node-type="blockGroup">
65
+ * <ul>
66
+ * <li>...</li>
67
+ * <li>...</li>
68
+ * </ul>
69
+ * </div>
70
+ * </div>
71
+ *
72
+ * This resulting format is parsed
73
+ */
74
+ function createGroups(element) {
75
+ element.querySelectorAll("li + ul, li + ol").forEach((list) => {
76
+ const listItem = list.previousElementSibling;
77
+ const blockContainer = document.createElement("div");
78
+ listItem.insertAdjacentElement("afterend", blockContainer);
79
+ blockContainer.append(listItem);
80
+ const blockGroup = document.createElement("div");
81
+ blockGroup.setAttribute("data-node-type", "blockGroup");
82
+ blockContainer.append(blockGroup);
83
+ while (blockContainer.nextElementSibling?.nodeName === "UL" ||
84
+ blockContainer.nextElementSibling?.nodeName === "OL") {
85
+ blockGroup.append(blockContainer.nextElementSibling);
86
+ }
87
+ });
88
+ }
89
+ // prevent XSS, similar to https://github.com/ProseMirror/prosemirror-view/blob/1251b2b412656a2a06263e4187574beb43651273/src/clipboard.ts#L204
90
+ // https://github.com/TypeCellOS/BlockNote/issues/601
91
+ let _detachedDoc = null;
92
+ function detachedDoc() {
93
+ return (_detachedDoc ||
94
+ (_detachedDoc = document.implementation.createHTMLDocument("title")));
95
+ }
96
+ export function nestedListsToBlockNoteStructure(elementOrHTML) {
97
+ if (typeof elementOrHTML === "string") {
98
+ const element = detachedDoc().createElement("div");
99
+ element.innerHTML = elementOrHTML;
100
+ elementOrHTML = element;
101
+ }
102
+ liftNestedListsToParent(elementOrHTML);
103
+ createGroups(elementOrHTML);
104
+ return elementOrHTML;
105
+ }
106
+ //# sourceMappingURL=nestedLists.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nestedLists.js","sourceRoot":"","sources":["../../../../../../src/api/parsers/html/util/nestedLists.ts"],"names":[],"mappings":"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"}