@fiduswriter/editor 0.1.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 (525) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +22 -0
  3. package/dist/bibliography/tools.js +53 -0
  4. package/dist/bibliography/tools.js.map +1 -0
  5. package/dist/citations/index.js +339 -0
  6. package/dist/citations/index.js.map +1 -0
  7. package/dist/citations/render.js +47 -0
  8. package/dist/citations/render.js.map +1 -0
  9. package/dist/clipboard/copy/index.js +2 -0
  10. package/dist/clipboard/copy/index.js.map +1 -0
  11. package/dist/clipboard/copy/schema.js +54 -0
  12. package/dist/clipboard/copy/schema.js.map +1 -0
  13. package/dist/clipboard/copy/serializers.js +132 -0
  14. package/dist/clipboard/copy/serializers.js.map +1 -0
  15. package/dist/clipboard/paste/fidus_writer.js +45 -0
  16. package/dist/clipboard/paste/fidus_writer.js.map +1 -0
  17. package/dist/clipboard/paste/general.js +76 -0
  18. package/dist/clipboard/paste/general.js.map +1 -0
  19. package/dist/clipboard/paste/google_docs.js +24 -0
  20. package/dist/clipboard/paste/google_docs.js.map +1 -0
  21. package/dist/clipboard/paste/html.js +68 -0
  22. package/dist/clipboard/paste/html.js.map +1 -0
  23. package/dist/clipboard/paste/index.js +3 -0
  24. package/dist/clipboard/paste/index.js.map +1 -0
  25. package/dist/clipboard/paste/libreoffice_writer.js +27 -0
  26. package/dist/clipboard/paste/libreoffice_writer.js.map +1 -0
  27. package/dist/clipboard/paste/microsoft_word.js +79 -0
  28. package/dist/clipboard/paste/microsoft_word.js.map +1 -0
  29. package/dist/clipboard/paste/text.js +41 -0
  30. package/dist/clipboard/paste/text.js.map +1 -0
  31. package/dist/collab/chat.js +154 -0
  32. package/dist/collab/chat.js.map +1 -0
  33. package/dist/collab/colors.js +62 -0
  34. package/dist/collab/colors.js.map +1 -0
  35. package/dist/collab/doc.js +1090 -0
  36. package/dist/collab/doc.js.map +1 -0
  37. package/dist/collab/index.js +75 -0
  38. package/dist/collab/index.js.map +1 -0
  39. package/dist/collab/merge/changeset.js +90 -0
  40. package/dist/collab/merge/changeset.js.map +1 -0
  41. package/dist/collab/merge/editor.js +708 -0
  42. package/dist/collab/merge/editor.js.map +1 -0
  43. package/dist/collab/merge/footnotes.js +149 -0
  44. package/dist/collab/merge/footnotes.js.map +1 -0
  45. package/dist/collab/merge/index.js +270 -0
  46. package/dist/collab/merge/index.js.map +1 -0
  47. package/dist/collab/merge/recreate_transform.js +259 -0
  48. package/dist/collab/merge/recreate_transform.js.map +1 -0
  49. package/dist/collab/merge/schema.js +117 -0
  50. package/dist/collab/merge/schema.js.map +1 -0
  51. package/dist/collab/merge/state_plugins/action.js +138 -0
  52. package/dist/collab/merge/state_plugins/action.js.map +1 -0
  53. package/dist/collab/merge/state_plugins/clipboard.js +32 -0
  54. package/dist/collab/merge/state_plugins/clipboard.js.map +1 -0
  55. package/dist/collab/merge/state_plugins/diff.js +541 -0
  56. package/dist/collab/merge/state_plugins/diff.js.map +1 -0
  57. package/dist/collab/merge/state_plugins/index.js +3 -0
  58. package/dist/collab/merge/state_plugins/index.js.map +1 -0
  59. package/dist/collab/merge/tools.js +175 -0
  60. package/dist/collab/merge/tools.js.map +1 -0
  61. package/dist/collab/templates.js +10 -0
  62. package/dist/collab/templates.js.map +1 -0
  63. package/dist/comments/comment.js +17 -0
  64. package/dist/comments/comment.js.map +1 -0
  65. package/dist/comments/editors/answer.js +43 -0
  66. package/dist/comments/editors/answer.js.map +1 -0
  67. package/dist/comments/editors/comment.js +278 -0
  68. package/dist/comments/editors/comment.js.map +1 -0
  69. package/dist/comments/editors/index.js +4 -0
  70. package/dist/comments/editors/index.js.map +1 -0
  71. package/dist/comments/editors/notify.js +13 -0
  72. package/dist/comments/editors/notify.js.map +1 -0
  73. package/dist/comments/editors/schema.js +60 -0
  74. package/dist/comments/editors/schema.js.map +1 -0
  75. package/dist/comments/index.js +11 -0
  76. package/dist/comments/index.js.map +1 -0
  77. package/dist/comments/interactions.js +379 -0
  78. package/dist/comments/interactions.js.map +1 -0
  79. package/dist/comments/store.js +438 -0
  80. package/dist/comments/store.js.map +1 -0
  81. package/dist/contacts/add_dialog.js +88 -0
  82. package/dist/contacts/add_dialog.js.map +1 -0
  83. package/dist/contacts/templates.js +23 -0
  84. package/dist/contacts/templates.js.map +1 -0
  85. package/dist/copyright_dialog/index.js +148 -0
  86. package/dist/copyright_dialog/index.js.map +1 -0
  87. package/dist/copyright_dialog/templates.js +48 -0
  88. package/dist/copyright_dialog/templates.js.map +1 -0
  89. package/dist/databases/bibliography.js +162 -0
  90. package/dist/databases/bibliography.js.map +1 -0
  91. package/dist/databases/images.js +260 -0
  92. package/dist/databases/images.js.map +1 -0
  93. package/dist/databases/index.js +55 -0
  94. package/dist/databases/index.js.map +1 -0
  95. package/dist/dialogs/citation.js +321 -0
  96. package/dist/dialogs/citation.js.map +1 -0
  97. package/dist/dialogs/code_block.js +192 -0
  98. package/dist/dialogs/code_block.js.map +1 -0
  99. package/dist/dialogs/contributor.js +132 -0
  100. package/dist/dialogs/contributor.js.map +1 -0
  101. package/dist/dialogs/figure.js +378 -0
  102. package/dist/dialogs/figure.js.map +1 -0
  103. package/dist/dialogs/index.js +11 -0
  104. package/dist/dialogs/index.js.map +1 -0
  105. package/dist/dialogs/language.js +47 -0
  106. package/dist/dialogs/language.js.map +1 -0
  107. package/dist/dialogs/link.js +243 -0
  108. package/dist/dialogs/link.js.map +1 -0
  109. package/dist/dialogs/math.js +121 -0
  110. package/dist/dialogs/math.js.map +1 -0
  111. package/dist/dialogs/ordered_list.js +67 -0
  112. package/dist/dialogs/ordered_list.js.map +1 -0
  113. package/dist/dialogs/revision.js +36 -0
  114. package/dist/dialogs/revision.js.map +1 -0
  115. package/dist/dialogs/subsup.js +109 -0
  116. package/dist/dialogs/subsup.js.map +1 -0
  117. package/dist/dialogs/table.js +217 -0
  118. package/dist/dialogs/table.js.map +1 -0
  119. package/dist/dialogs/templates.js +366 -0
  120. package/dist/dialogs/templates.js.map +1 -0
  121. package/dist/document_template/exporter.js +83 -0
  122. package/dist/document_template/exporter.js.map +1 -0
  123. package/dist/document_template/index.js +327 -0
  124. package/dist/document_template/index.js.map +1 -0
  125. package/dist/documents/access_rights/index.js +532 -0
  126. package/dist/documents/access_rights/index.js.map +1 -0
  127. package/dist/documents/access_rights/templates.js +150 -0
  128. package/dist/documents/access_rights/templates.js.map +1 -0
  129. package/dist/e2ee/encryptor.js +201 -0
  130. package/dist/e2ee/encryptor.js.map +1 -0
  131. package/dist/e2ee/key-manager.js +171 -0
  132. package/dist/e2ee/key-manager.js.map +1 -0
  133. package/dist/e2ee/passphrase-crypto.js +365 -0
  134. package/dist/e2ee/passphrase-crypto.js.map +1 -0
  135. package/dist/e2ee/passphrase-dialog.js +548 -0
  136. package/dist/e2ee/passphrase-dialog.js.map +1 -0
  137. package/dist/e2ee/passphrase-manager.js +350 -0
  138. package/dist/e2ee/passphrase-manager.js.map +1 -0
  139. package/dist/e2ee/password-dialog.js +552 -0
  140. package/dist/e2ee/password-dialog.js.map +1 -0
  141. package/dist/e2ee/snapshot-manager.js +238 -0
  142. package/dist/e2ee/snapshot-manager.js.map +1 -0
  143. package/dist/exporter/native/copy.js +29 -0
  144. package/dist/exporter/native/copy.js.map +1 -0
  145. package/dist/exporter/native/file.js +19 -0
  146. package/dist/exporter/native/file.js.map +1 -0
  147. package/dist/exporter/native/index.js +4 -0
  148. package/dist/exporter/native/index.js.map +1 -0
  149. package/dist/exporter/native/revision.js +54 -0
  150. package/dist/exporter/native/revision.js.map +1 -0
  151. package/dist/exporter/native/zip.js +2 -0
  152. package/dist/exporter/native/zip.js.map +1 -0
  153. package/dist/footnotes/editor.js +180 -0
  154. package/dist/footnotes/editor.js.map +1 -0
  155. package/dist/footnotes/index.js +15 -0
  156. package/dist/footnotes/index.js.map +1 -0
  157. package/dist/footnotes/layout.js +125 -0
  158. package/dist/footnotes/layout.js.map +1 -0
  159. package/dist/footnotes/state_plugins/access_rights.js +25 -0
  160. package/dist/footnotes/state_plugins/access_rights.js.map +1 -0
  161. package/dist/footnotes/state_plugins/index.js +2 -0
  162. package/dist/footnotes/state_plugins/index.js.map +1 -0
  163. package/dist/images/edit_dialog/edit_dialog/index.js +186 -0
  164. package/dist/images/edit_dialog/edit_dialog/index.js.map +1 -0
  165. package/dist/images/edit_dialog/edit_dialog/model.js +152 -0
  166. package/dist/images/edit_dialog/edit_dialog/model.js.map +1 -0
  167. package/dist/images/edit_dialog/edit_dialog/templates.js +33 -0
  168. package/dist/images/edit_dialog/edit_dialog/templates.js.map +1 -0
  169. package/dist/images/edit_dialog/model.js +6 -0
  170. package/dist/images/edit_dialog/model.js.map +1 -0
  171. package/dist/images/selection_dialog/index.js +149 -0
  172. package/dist/images/selection_dialog/index.js.map +1 -0
  173. package/dist/index.js +1002 -0
  174. package/dist/index.js.map +1 -0
  175. package/dist/keymap.js +73 -0
  176. package/dist/keymap.js.map +1 -0
  177. package/dist/marginboxes/index.js +674 -0
  178. package/dist/marginboxes/index.js.map +1 -0
  179. package/dist/marginboxes/templates.js +447 -0
  180. package/dist/marginboxes/templates.js.map +1 -0
  181. package/dist/menus/code_block/index.js +2 -0
  182. package/dist/menus/code_block/index.js.map +1 -0
  183. package/dist/menus/code_block/model.js +49 -0
  184. package/dist/menus/code_block/model.js.map +1 -0
  185. package/dist/menus/figure/index.js +3 -0
  186. package/dist/menus/figure/index.js.map +1 -0
  187. package/dist/menus/figure/model.js +80 -0
  188. package/dist/menus/figure/model.js.map +1 -0
  189. package/dist/menus/figure/utils.js +6 -0
  190. package/dist/menus/figure/utils.js.map +1 -0
  191. package/dist/menus/headerbar/index.js +3 -0
  192. package/dist/menus/headerbar/index.js.map +1 -0
  193. package/dist/menus/headerbar/model.js +743 -0
  194. package/dist/menus/headerbar/model.js.map +1 -0
  195. package/dist/menus/headerbar/view.js +579 -0
  196. package/dist/menus/headerbar/view.js.map +1 -0
  197. package/dist/menus/image/index.js +2 -0
  198. package/dist/menus/image/index.js.map +1 -0
  199. package/dist/menus/image/model.js +32 -0
  200. package/dist/menus/image/model.js.map +1 -0
  201. package/dist/menus/index.js +10 -0
  202. package/dist/menus/index.js.map +1 -0
  203. package/dist/menus/navigator/index.js +2 -0
  204. package/dist/menus/navigator/index.js.map +1 -0
  205. package/dist/menus/navigator/model.js +29 -0
  206. package/dist/menus/navigator/model.js.map +1 -0
  207. package/dist/menus/ordered_list/index.js +2 -0
  208. package/dist/menus/ordered_list/index.js.map +1 -0
  209. package/dist/menus/ordered_list/model.js +17 -0
  210. package/dist/menus/ordered_list/model.js.map +1 -0
  211. package/dist/menus/selection/index.js +3 -0
  212. package/dist/menus/selection/index.js.map +1 -0
  213. package/dist/menus/selection/model.js +108 -0
  214. package/dist/menus/selection/model.js.map +1 -0
  215. package/dist/menus/selection/view.js +125 -0
  216. package/dist/menus/selection/view.js.map +1 -0
  217. package/dist/menus/table/index.js +2 -0
  218. package/dist/menus/table/index.js.map +1 -0
  219. package/dist/menus/table/model.js +319 -0
  220. package/dist/menus/table/model.js.map +1 -0
  221. package/dist/menus/toolbar/index.js +3 -0
  222. package/dist/menus/toolbar/index.js.map +1 -0
  223. package/dist/menus/toolbar/model.js +747 -0
  224. package/dist/menus/toolbar/model.js.map +1 -0
  225. package/dist/menus/toolbar/view.js +314 -0
  226. package/dist/menus/toolbar/view.js.map +1 -0
  227. package/dist/navigator/index.js +435 -0
  228. package/dist/navigator/index.js.map +1 -0
  229. package/dist/no_collab_save/index.js +169 -0
  230. package/dist/no_collab_save/index.js.map +1 -0
  231. package/dist/plugins/citation_dialog/index.js +2 -0
  232. package/dist/plugins/citation_dialog/index.js.map +1 -0
  233. package/dist/plugins/editor/index.js +2 -0
  234. package/dist/plugins/editor/index.js.map +1 -0
  235. package/dist/state_plugins/access_rights.js +30 -0
  236. package/dist/state_plugins/access_rights.js.map +1 -0
  237. package/dist/state_plugins/citation_render.js +78 -0
  238. package/dist/state_plugins/citation_render.js.map +1 -0
  239. package/dist/state_plugins/clipboard.js +217 -0
  240. package/dist/state_plugins/clipboard.js.map +1 -0
  241. package/dist/state_plugins/code_block.js +165 -0
  242. package/dist/state_plugins/code_block.js.map +1 -0
  243. package/dist/state_plugins/collab_carets.js +115 -0
  244. package/dist/state_plugins/collab_carets.js.map +1 -0
  245. package/dist/state_plugins/comments.js +197 -0
  246. package/dist/state_plugins/comments.js.map +1 -0
  247. package/dist/state_plugins/contributor_input/add_button.js +101 -0
  248. package/dist/state_plugins/contributor_input/add_button.js.map +1 -0
  249. package/dist/state_plugins/contributor_input/dropup.js +273 -0
  250. package/dist/state_plugins/contributor_input/dropup.js.map +1 -0
  251. package/dist/state_plugins/contributor_input/helpers.js +23 -0
  252. package/dist/state_plugins/contributor_input/helpers.js.map +1 -0
  253. package/dist/state_plugins/contributor_input/index.js +3 -0
  254. package/dist/state_plugins/contributor_input/index.js.map +1 -0
  255. package/dist/state_plugins/contributor_input/node_view.js +76 -0
  256. package/dist/state_plugins/contributor_input/node_view.js.map +1 -0
  257. package/dist/state_plugins/contributor_input/plugin.js +236 -0
  258. package/dist/state_plugins/contributor_input/plugin.js.map +1 -0
  259. package/dist/state_plugins/document_template.js +213 -0
  260. package/dist/state_plugins/document_template.js.map +1 -0
  261. package/dist/state_plugins/figure.js +90 -0
  262. package/dist/state_plugins/figure.js.map +1 -0
  263. package/dist/state_plugins/footnote_markers.js +187 -0
  264. package/dist/state_plugins/footnote_markers.js.map +1 -0
  265. package/dist/state_plugins/headerbar.js +10 -0
  266. package/dist/state_plugins/headerbar.js.map +1 -0
  267. package/dist/state_plugins/index.js +27 -0
  268. package/dist/state_plugins/index.js.map +1 -0
  269. package/dist/state_plugins/inline_math.js +719 -0
  270. package/dist/state_plugins/inline_math.js.map +1 -0
  271. package/dist/state_plugins/inline_reference/dropup.js +182 -0
  272. package/dist/state_plugins/inline_reference/dropup.js.map +1 -0
  273. package/dist/state_plugins/inline_reference/index.js +2 -0
  274. package/dist/state_plugins/inline_reference/index.js.map +1 -0
  275. package/dist/state_plugins/inline_reference/plugin.js +1134 -0
  276. package/dist/state_plugins/inline_reference/plugin.js.map +1 -0
  277. package/dist/state_plugins/jump_hidden_nodes.js +47 -0
  278. package/dist/state_plugins/jump_hidden_nodes.js.map +1 -0
  279. package/dist/state_plugins/links.js +622 -0
  280. package/dist/state_plugins/links.js.map +1 -0
  281. package/dist/state_plugins/marginboxes.js +13 -0
  282. package/dist/state_plugins/marginboxes.js.map +1 -0
  283. package/dist/state_plugins/ordered_list_menu.js +72 -0
  284. package/dist/state_plugins/ordered_list_menu.js.map +1 -0
  285. package/dist/state_plugins/placeholders.js +98 -0
  286. package/dist/state_plugins/placeholders.js.map +1 -0
  287. package/dist/state_plugins/search.js +212 -0
  288. package/dist/state_plugins/search.js.map +1 -0
  289. package/dist/state_plugins/selection_menu.js +10 -0
  290. package/dist/state_plugins/selection_menu.js.map +1 -0
  291. package/dist/state_plugins/settings.js +191 -0
  292. package/dist/state_plugins/settings.js.map +1 -0
  293. package/dist/state_plugins/table.js +104 -0
  294. package/dist/state_plugins/table.js.map +1 -0
  295. package/dist/state_plugins/tag_input/helpers.js +55 -0
  296. package/dist/state_plugins/tag_input/helpers.js.map +1 -0
  297. package/dist/state_plugins/tag_input/index.js +3 -0
  298. package/dist/state_plugins/tag_input/index.js.map +1 -0
  299. package/dist/state_plugins/tag_input/node_view.js +77 -0
  300. package/dist/state_plugins/tag_input/node_view.js.map +1 -0
  301. package/dist/state_plugins/tag_input/plugin.js +199 -0
  302. package/dist/state_plugins/tag_input/plugin.js.map +1 -0
  303. package/dist/state_plugins/tag_input/tag_editor.js +159 -0
  304. package/dist/state_plugins/tag_input/tag_editor.js.map +1 -0
  305. package/dist/state_plugins/tag_input/tag_editor_plugins.js +61 -0
  306. package/dist/state_plugins/tag_input/tag_editor_plugins.js.map +1 -0
  307. package/dist/state_plugins/toc_render.js +142 -0
  308. package/dist/state_plugins/toc_render.js.map +1 -0
  309. package/dist/state_plugins/toolbar.js +10 -0
  310. package/dist/state_plugins/toolbar.js.map +1 -0
  311. package/dist/state_plugins/track/find_selected_changes.js +82 -0
  312. package/dist/state_plugins/track/find_selected_changes.js.map +1 -0
  313. package/dist/state_plugins/track/helpers.js +67 -0
  314. package/dist/state_plugins/track/helpers.js.map +1 -0
  315. package/dist/state_plugins/track/index.js +3 -0
  316. package/dist/state_plugins/track/index.js.map +1 -0
  317. package/dist/state_plugins/track/plugin.js +114 -0
  318. package/dist/state_plugins/track/plugin.js.map +1 -0
  319. package/dist/tools/index.js +4 -0
  320. package/dist/tools/index.js.map +1 -0
  321. package/dist/tools/key_bindings/index.js +20 -0
  322. package/dist/tools/key_bindings/index.js.map +1 -0
  323. package/dist/tools/key_bindings/templates.js +68 -0
  324. package/dist/tools/key_bindings/templates.js.map +1 -0
  325. package/dist/tools/search_replace/index.js +275 -0
  326. package/dist/tools/search_replace/index.js.map +1 -0
  327. package/dist/tools/search_replace/templates.js +18 -0
  328. package/dist/tools/search_replace/templates.js.map +1 -0
  329. package/dist/tools/word_count/index.js +40 -0
  330. package/dist/tools/word_count/index.js.map +1 -0
  331. package/dist/tools/word_count/templates.js +27 -0
  332. package/dist/tools/word_count/templates.js.map +1 -0
  333. package/dist/track/accept.js +66 -0
  334. package/dist/track/accept.js.map +1 -0
  335. package/dist/track/accept_all.js +51 -0
  336. package/dist/track/accept_all.js.map +1 -0
  337. package/dist/track/accept_all_no_insertions.js +63 -0
  338. package/dist/track/accept_all_no_insertions.js.map +1 -0
  339. package/dist/track/amend_transaction.js +390 -0
  340. package/dist/track/amend_transaction.js.map +1 -0
  341. package/dist/track/delete.js +62 -0
  342. package/dist/track/delete.js.map +1 -0
  343. package/dist/track/index.js +6 -0
  344. package/dist/track/index.js.map +1 -0
  345. package/dist/track/mod.js +86 -0
  346. package/dist/track/mod.js.map +1 -0
  347. package/dist/track/reject.js +67 -0
  348. package/dist/track/reject.js.map +1 -0
  349. package/dist/track/reject_all.js +56 -0
  350. package/dist/track/reject_all.js.map +1 -0
  351. package/package.json +80 -0
  352. package/src/bibliography/tools.js +58 -0
  353. package/src/citations/index.js +443 -0
  354. package/src/citations/render.js +68 -0
  355. package/src/clipboard/copy/index.js +1 -0
  356. package/src/clipboard/copy/schema.js +62 -0
  357. package/src/clipboard/copy/serializers.js +179 -0
  358. package/src/clipboard/paste/fidus_writer.js +55 -0
  359. package/src/clipboard/paste/general.js +80 -0
  360. package/src/clipboard/paste/google_docs.js +26 -0
  361. package/src/clipboard/paste/html.js +76 -0
  362. package/src/clipboard/paste/index.js +2 -0
  363. package/src/clipboard/paste/libreoffice_writer.js +32 -0
  364. package/src/clipboard/paste/microsoft_word.js +87 -0
  365. package/src/clipboard/paste/text.js +58 -0
  366. package/src/collab/chat.js +195 -0
  367. package/src/collab/colors.js +67 -0
  368. package/src/collab/doc.js +1436 -0
  369. package/src/collab/index.js +81 -0
  370. package/src/collab/merge/changeset.js +103 -0
  371. package/src/collab/merge/editor.js +1065 -0
  372. package/src/collab/merge/footnotes.js +175 -0
  373. package/src/collab/merge/index.js +401 -0
  374. package/src/collab/merge/recreate_transform.js +326 -0
  375. package/src/collab/merge/schema.js +135 -0
  376. package/src/collab/merge/state_plugins/action.js +171 -0
  377. package/src/collab/merge/state_plugins/clipboard.js +32 -0
  378. package/src/collab/merge/state_plugins/diff.js +780 -0
  379. package/src/collab/merge/state_plugins/index.js +2 -0
  380. package/src/collab/merge/tools.js +217 -0
  381. package/src/collab/templates.js +10 -0
  382. package/src/comments/comment.js +29 -0
  383. package/src/comments/editors/answer.js +55 -0
  384. package/src/comments/editors/comment.js +318 -0
  385. package/src/comments/editors/index.js +4 -0
  386. package/src/comments/editors/notify.js +13 -0
  387. package/src/comments/editors/schema.js +65 -0
  388. package/src/comments/index.js +11 -0
  389. package/src/comments/interactions.js +465 -0
  390. package/src/comments/store.js +513 -0
  391. package/src/contacts/add_dialog.js +110 -0
  392. package/src/contacts/templates.js +28 -0
  393. package/src/copyright_dialog/index.js +179 -0
  394. package/src/copyright_dialog/templates.js +56 -0
  395. package/src/databases/bibliography.js +179 -0
  396. package/src/databases/images.js +320 -0
  397. package/src/databases/index.js +69 -0
  398. package/src/dialogs/citation.js +428 -0
  399. package/src/dialogs/code_block.js +242 -0
  400. package/src/dialogs/contributor.js +173 -0
  401. package/src/dialogs/figure.js +479 -0
  402. package/src/dialogs/index.js +10 -0
  403. package/src/dialogs/language.js +58 -0
  404. package/src/dialogs/link.js +358 -0
  405. package/src/dialogs/math.js +148 -0
  406. package/src/dialogs/ordered_list.js +84 -0
  407. package/src/dialogs/revision.js +43 -0
  408. package/src/dialogs/subsup.js +116 -0
  409. package/src/dialogs/table.js +258 -0
  410. package/src/dialogs/templates.js +426 -0
  411. package/src/document_template/exporter.js +97 -0
  412. package/src/document_template/index.js +483 -0
  413. package/src/documents/access_rights/index.js +693 -0
  414. package/src/documents/access_rights/templates.js +178 -0
  415. package/src/e2ee/encryptor.js +228 -0
  416. package/src/e2ee/key-manager.js +202 -0
  417. package/src/e2ee/passphrase-crypto.js +606 -0
  418. package/src/e2ee/passphrase-dialog.js +655 -0
  419. package/src/e2ee/passphrase-manager.js +502 -0
  420. package/src/e2ee/password-dialog.js +652 -0
  421. package/src/e2ee/snapshot-manager.js +305 -0
  422. package/src/exporter/native/copy.js +54 -0
  423. package/src/exporter/native/file.js +37 -0
  424. package/src/exporter/native/index.js +3 -0
  425. package/src/exporter/native/revision.js +86 -0
  426. package/src/exporter/native/zip.js +1 -0
  427. package/src/footnotes/editor.js +227 -0
  428. package/src/footnotes/index.js +16 -0
  429. package/src/footnotes/layout.js +190 -0
  430. package/src/footnotes/state_plugins/access_rights.js +39 -0
  431. package/src/footnotes/state_plugins/index.js +1 -0
  432. package/src/images/edit_dialog/edit_dialog/index.js +222 -0
  433. package/src/images/edit_dialog/edit_dialog/model.js +183 -0
  434. package/src/images/edit_dialog/edit_dialog/templates.js +41 -0
  435. package/src/images/edit_dialog/model.js +5 -0
  436. package/src/images/selection_dialog/index.js +176 -0
  437. package/src/index.js +1252 -0
  438. package/src/keymap.js +102 -0
  439. package/src/marginboxes/index.js +946 -0
  440. package/src/marginboxes/templates.js +573 -0
  441. package/src/menus/code_block/index.js +1 -0
  442. package/src/menus/code_block/model.js +52 -0
  443. package/src/menus/figure/index.js +2 -0
  444. package/src/menus/figure/model.js +91 -0
  445. package/src/menus/figure/utils.js +5 -0
  446. package/src/menus/headerbar/index.js +2 -0
  447. package/src/menus/headerbar/model.js +1077 -0
  448. package/src/menus/headerbar/view.js +675 -0
  449. package/src/menus/image/index.js +1 -0
  450. package/src/menus/image/model.js +32 -0
  451. package/src/menus/index.js +9 -0
  452. package/src/menus/navigator/index.js +1 -0
  453. package/src/menus/navigator/model.js +28 -0
  454. package/src/menus/ordered_list/index.js +1 -0
  455. package/src/menus/ordered_list/model.js +19 -0
  456. package/src/menus/selection/index.js +2 -0
  457. package/src/menus/selection/model.js +134 -0
  458. package/src/menus/selection/view.js +154 -0
  459. package/src/menus/table/index.js +1 -0
  460. package/src/menus/table/model.js +414 -0
  461. package/src/menus/toolbar/index.js +2 -0
  462. package/src/menus/toolbar/model.js +920 -0
  463. package/src/menus/toolbar/view.js +354 -0
  464. package/src/navigator/index.js +515 -0
  465. package/src/no_collab_save/index.js +209 -0
  466. package/src/plugins/citation_dialog/index.js +1 -0
  467. package/src/plugins/editor/index.js +1 -0
  468. package/src/state_plugins/access_rights.js +47 -0
  469. package/src/state_plugins/citation_render.js +88 -0
  470. package/src/state_plugins/clipboard.js +289 -0
  471. package/src/state_plugins/code_block.js +201 -0
  472. package/src/state_plugins/collab_carets.js +152 -0
  473. package/src/state_plugins/comments.js +259 -0
  474. package/src/state_plugins/contributor_input/add_button.js +134 -0
  475. package/src/state_plugins/contributor_input/dropup.js +318 -0
  476. package/src/state_plugins/contributor_input/helpers.js +24 -0
  477. package/src/state_plugins/contributor_input/index.js +2 -0
  478. package/src/state_plugins/contributor_input/node_view.js +86 -0
  479. package/src/state_plugins/contributor_input/plugin.js +318 -0
  480. package/src/state_plugins/document_template.js +315 -0
  481. package/src/state_plugins/figure.js +108 -0
  482. package/src/state_plugins/footnote_markers.js +238 -0
  483. package/src/state_plugins/headerbar.js +12 -0
  484. package/src/state_plugins/index.js +73 -0
  485. package/src/state_plugins/inline_math.js +918 -0
  486. package/src/state_plugins/inline_reference/dropup.js +208 -0
  487. package/src/state_plugins/inline_reference/index.js +5 -0
  488. package/src/state_plugins/inline_reference/plugin.js +1429 -0
  489. package/src/state_plugins/jump_hidden_nodes.js +58 -0
  490. package/src/state_plugins/links.js +830 -0
  491. package/src/state_plugins/marginboxes.js +14 -0
  492. package/src/state_plugins/ordered_list_menu.js +84 -0
  493. package/src/state_plugins/placeholders.js +123 -0
  494. package/src/state_plugins/search.js +251 -0
  495. package/src/state_plugins/selection_menu.js +12 -0
  496. package/src/state_plugins/settings.js +223 -0
  497. package/src/state_plugins/table.js +127 -0
  498. package/src/state_plugins/tag_input/helpers.js +69 -0
  499. package/src/state_plugins/tag_input/index.js +2 -0
  500. package/src/state_plugins/tag_input/node_view.js +85 -0
  501. package/src/state_plugins/tag_input/plugin.js +278 -0
  502. package/src/state_plugins/tag_input/tag_editor.js +202 -0
  503. package/src/state_plugins/tag_input/tag_editor_plugins.js +74 -0
  504. package/src/state_plugins/toc_render.js +160 -0
  505. package/src/state_plugins/toolbar.js +12 -0
  506. package/src/state_plugins/track/find_selected_changes.js +107 -0
  507. package/src/state_plugins/track/helpers.js +108 -0
  508. package/src/state_plugins/track/index.js +6 -0
  509. package/src/state_plugins/track/plugin.js +140 -0
  510. package/src/tools/index.js +3 -0
  511. package/src/tools/key_bindings/index.js +21 -0
  512. package/src/tools/key_bindings/templates.js +68 -0
  513. package/src/tools/search_replace/index.js +421 -0
  514. package/src/tools/search_replace/templates.js +19 -0
  515. package/src/tools/word_count/index.js +59 -0
  516. package/src/tools/word_count/templates.js +34 -0
  517. package/src/track/accept.js +102 -0
  518. package/src/track/accept_all.js +103 -0
  519. package/src/track/accept_all_no_insertions.js +102 -0
  520. package/src/track/amend_transaction.js +562 -0
  521. package/src/track/delete.js +92 -0
  522. package/src/track/index.js +8 -0
  523. package/src/track/mod.js +116 -0
  524. package/src/track/reject.js +116 -0
  525. package/src/track/reject_all.js +121 -0
@@ -0,0 +1,278 @@
1
+ import {GapCursor} from "prosemirror-gapcursor"
2
+ import {
3
+ NodeSelection,
4
+ Plugin,
5
+ PluginKey,
6
+ TextSelection
7
+ } from "prosemirror-state"
8
+
9
+ import {nextSelection, submitTag} from "./helpers"
10
+ import {TagsPartView} from "./node_view"
11
+ import {tagInputReferences} from "./tag_editor"
12
+
13
+ const key = new PluginKey("tagInput")
14
+
15
+ // Track mouse click state across transactions using closure variable
16
+ let mouseClickActive = false
17
+ let mouseClickTimer = null
18
+ // Track when we've explicitly blurred the tag input to prevent refocus
19
+ let tagInputJustBlurred = false
20
+
21
+ // Export function to check if we should prevent tag input focus
22
+ export const shouldPreventTagInputFocus = () => tagInputJustBlurred
23
+
24
+ export const tagInputPlugin = options =>
25
+ new Plugin({
26
+ key,
27
+ state: {
28
+ init(_config, state) {
29
+ if (options.editor.docInfo.access_rights === "write") {
30
+ this.spec.props.nodeViews["tags_part"] = (
31
+ node,
32
+ view,
33
+ getPos
34
+ ) => new TagsPartView(node, view, getPos)
35
+ }
36
+
37
+ // Find all tags_part nodes in the document
38
+ const tagsPartPositions = []
39
+ state.doc.descendants((node, pos) => {
40
+ if (node.type.name === "tags_part") {
41
+ tagsPartPositions.push({
42
+ start: pos,
43
+ end: pos + node.nodeSize
44
+ })
45
+ }
46
+ })
47
+
48
+ return {tagsPartPositions}
49
+ },
50
+ apply(tr, prev) {
51
+ // If the document was modified, update all positions
52
+ if (tr.docChanged) {
53
+ const newPositions = prev.tagsPartPositions.map(range => ({
54
+ start: tr.mapping.map(range.start),
55
+ end: tr.mapping.map(range.end)
56
+ }))
57
+
58
+ return {tagsPartPositions: newPositions}
59
+ }
60
+ return prev
61
+ }
62
+ },
63
+ props: {
64
+ nodeViews: {},
65
+ handleDOMEvents: {
66
+ mousedown(view, event) {
67
+ // Mark that this selection change came from a mouse click
68
+ // Set the closure variable to indicate a mouse click is happening
69
+ mouseClickActive = true
70
+
71
+ // Clear any existing timer
72
+ if (mouseClickTimer) {
73
+ clearTimeout(mouseClickTimer)
74
+ }
75
+
76
+ // Reset after a delay to allow all related transactions to process
77
+ // Including blur handlers and any delayed events
78
+ mouseClickTimer = setTimeout(() => {
79
+ mouseClickActive = false
80
+ mouseClickTimer = null
81
+ }, 100)
82
+
83
+ // Check if we're clicking outside a focused tag input
84
+ const activeElement = document.activeElement
85
+ // Check if active element is inside a tag-input container
86
+ const tagInputContainer =
87
+ activeElement?.closest(".tag-input")
88
+ const clickedInsideTagInput =
89
+ event.target.closest(".tag-input")
90
+ // Check if clicking on a tag within the tags_part (but not the tag input)
91
+ const clickedOnTag =
92
+ event.target.closest(".tag") ||
93
+ event.target.closest(".doc-tags_part")
94
+
95
+ // If a tag input has focus and we're clicking outside it (including on existing tags), submit and blur it
96
+ if (
97
+ tagInputContainer &&
98
+ (!clickedInsideTagInput || clickedOnTag)
99
+ ) {
100
+ // Get the stored references from WeakMap
101
+ const refs = tagInputReferences.get(tagInputContainer)
102
+ if (refs) {
103
+ const {tagInputView, mainView, getPos} = refs
104
+
105
+ // Submit the tag immediately with the valid position
106
+ submitTag(tagInputView, mainView, getPos)
107
+
108
+ // If we clicked outside the tags_part entirely, set selection to clicked position
109
+ // If we clicked on a tag, let the normal click handling select it
110
+ if (!clickedOnTag) {
111
+ // Now set the selection based on where the user clicked
112
+ // We need to do this synchronously before appendTransaction runs
113
+ const clickPos = view.posAtCoords({
114
+ left: event.clientX,
115
+ top: event.clientY
116
+ })
117
+ if (clickPos) {
118
+ const tr = view.state.tr.setSelection(
119
+ TextSelection.create(
120
+ view.state.doc,
121
+ clickPos.pos
122
+ )
123
+ )
124
+ view.dispatch(tr)
125
+ view.focus()
126
+ }
127
+ } else {
128
+ // Blur the tag input first, then focus the main view
129
+
130
+ // Set flag to prevent tag input from being refocused
131
+ tagInputJustBlurred = true
132
+
133
+ // Blur the tag input
134
+ tagInputView.dom.blur()
135
+
136
+ // Find the position of the clicked tag and select it
137
+ const clickPos = view.posAtCoords({
138
+ left: event.clientX,
139
+ top: event.clientY
140
+ })
141
+ if (clickPos) {
142
+ // Try to create a NodeSelection on the tag
143
+ try {
144
+ const node = view.state.doc.nodeAt(
145
+ clickPos.pos
146
+ )
147
+ if (node && node.type.name === "tag") {
148
+ const tr =
149
+ view.state.tr.setSelection(
150
+ NodeSelection.create(
151
+ view.state.doc,
152
+ clickPos.pos
153
+ )
154
+ )
155
+ view.dispatch(tr)
156
+ } else {
157
+ // If not directly on a tag, try the position before
158
+ const nodeBefore =
159
+ view.state.doc.nodeAt(
160
+ clickPos.pos - 1
161
+ )
162
+ if (
163
+ nodeBefore &&
164
+ nodeBefore.type.name === "tag"
165
+ ) {
166
+ const tr =
167
+ view.state.tr.setSelection(
168
+ NodeSelection.create(
169
+ view.state.doc,
170
+ clickPos.pos - 1
171
+ )
172
+ )
173
+ view.dispatch(tr)
174
+ }
175
+ }
176
+ } catch {
177
+ // Silently ignore selection errors
178
+ }
179
+ }
180
+
181
+ view.focus()
182
+
183
+ // Reset the flag after a short delay
184
+ setTimeout(() => {
185
+ tagInputJustBlurred = false
186
+ }, 150)
187
+ }
188
+ }
189
+ }
190
+
191
+ return false
192
+ }
193
+ }
194
+ },
195
+ appendTransaction: (trs, oldState, newState) => {
196
+ // If selection is not collapsed or not changed, don't do anything
197
+ if (
198
+ newState.selection.from !== newState.selection.to ||
199
+ !trs.some(tr => tr.selectionSet)
200
+ ) {
201
+ return
202
+ }
203
+
204
+ const selectionPos = newState.selection.from
205
+ const pluginState = key.getState(newState)
206
+
207
+ // If this selection change came from a mouse click, don't interfere
208
+ if (mouseClickActive) {
209
+ return
210
+ }
211
+
212
+ // If selection is already a NodeSelection on a tag, don't interfere
213
+ if (newState.selection instanceof NodeSelection) {
214
+ const selectedNode = newState.selection.node
215
+ if (selectedNode && selectedNode.type.name === "tag") {
216
+ return
217
+ }
218
+ }
219
+
220
+ // Check if selection is within any tags_part node
221
+ const tagsPartRange = pluginState.tagsPartPositions.find(
222
+ range => selectionPos > range.start && selectionPos < range.end
223
+ )
224
+
225
+ if (tagsPartRange) {
226
+ const oldSelectionPos = oldState.selection.from
227
+
228
+ if (selectionPos + 1 === tagsPartRange.end) {
229
+ // Selection is at end of tags_part.
230
+ // Put caret into tag editor if write access is present.
231
+ // Otherwise, move caret beyond tags_part.
232
+ if (options.editor.docInfo.access_rights === "write") {
233
+ // tag editor will be activated by node view.
234
+ return
235
+ }
236
+ if (oldSelectionPos < selectionPos) {
237
+ const newSelection = nextSelection(
238
+ newState,
239
+ tagsPartRange.end,
240
+ 1
241
+ )
242
+ if (!newSelection) {
243
+ // Cannot find a location. Give up.
244
+ return
245
+ }
246
+
247
+ return newState.tr.setSelection(newSelection)
248
+ }
249
+ }
250
+
251
+ const selectedNodePos =
252
+ oldSelectionPos < selectionPos
253
+ ? selectionPos
254
+ : selectionPos - 1
255
+
256
+ if (selectedNodePos === tagsPartRange.start) {
257
+ // selection is at start of tags node. Find previous possible selection location.
258
+ const newSelection = nextSelection(
259
+ newState,
260
+ selectedNodePos,
261
+ -1
262
+ )
263
+ if (!newSelection) {
264
+ // Cannot find a location. Give up.
265
+ return
266
+ }
267
+ return newState.tr.setSelection(newSelection)
268
+ } else {
269
+ // Select an entire tag node
270
+ return newState.tr.setSelection(
271
+ NodeSelection.create(newState.doc, selectedNodePos)
272
+ )
273
+ }
274
+ }
275
+
276
+ return null
277
+ }
278
+ })
@@ -0,0 +1,202 @@
1
+ import {history, redo, undo} from "prosemirror-history"
2
+ import {keymap} from "prosemirror-keymap"
3
+ import {Schema} from "prosemirror-model"
4
+ import {NodeSelection, TextSelection} from "prosemirror-state"
5
+ import {EditorState} from "prosemirror-state"
6
+ import {EditorView} from "prosemirror-view"
7
+
8
+ import {nextSelection, submitTag} from "./helpers"
9
+ import {pastePlugin, placeholderPlugin} from "./tag_editor_plugins"
10
+
11
+ // WeakMap to store tag input references for access from the plugin
12
+ export const tagInputReferences = new WeakMap()
13
+
14
+ const doc = {content: "tag"},
15
+ tag = {
16
+ content: "inline*",
17
+ parseDOM: [{tag: "div.tag-input-editor"}],
18
+ toDOM() {
19
+ return [
20
+ "div",
21
+ {
22
+ class: "tag-input-editor"
23
+ },
24
+ 0
25
+ ]
26
+ }
27
+ },
28
+ text = {group: "inline"}
29
+
30
+ const schema = new Schema({
31
+ nodes: {doc, tag, text},
32
+ marks: {}
33
+ })
34
+
35
+ const ArrowLeft = (state, dispatch, getNode, view, getPos) => {
36
+ // If we're at the leftmost position (position 1), stopEvent will handle moving out of the tag
37
+ if (state.selection.to > 1) {
38
+ // Inside the tag input, move caret left normally
39
+ const tr = state.tr.setSelection(
40
+ TextSelection.create(
41
+ state.doc,
42
+ state.selection.from - 1,
43
+ state.selection.to - 1
44
+ )
45
+ )
46
+ dispatch(tr)
47
+ return true
48
+ } else {
49
+ const node = getNode()
50
+ // Exit tag input to the left
51
+ if (node.nodeSize > 2) {
52
+ // At least one tag
53
+ const startPos = getPos() + node.nodeSize - 2
54
+ view.dispatch(
55
+ view.state.tr.setSelection(
56
+ NodeSelection.create(view.state.doc, startPos)
57
+ )
58
+ )
59
+ view.focus()
60
+ return true
61
+ } else {
62
+ // There is no tag
63
+ return ArrowUp(state, dispatch, getNode, view, getPos)
64
+ }
65
+ }
66
+ }
67
+
68
+ const ArrowUp = (_state, _dispatch, _getNode, view, getPos) => {
69
+ // We jump to the section before this one.
70
+ const startPos = getPos()
71
+
72
+ const newSelection = nextSelection(view.state, startPos, -1)
73
+
74
+ if (!newSelection) {
75
+ return false
76
+ }
77
+
78
+ view.dispatch(view.state.tr.setSelection(newSelection))
79
+ view.focus()
80
+ return true
81
+ }
82
+
83
+ const ArrowRight = (state, dispatch, getNode, view, getPos) => {
84
+ const docSize = state.doc.nodeSize - 3
85
+ // If we're at the rightmost position, stopEvent will handle moving out of the tag
86
+ if (state.selection.from < docSize) {
87
+ // Inside the tag input, move caret right normally
88
+ const tr = state.tr.setSelection(
89
+ TextSelection.create(
90
+ state.doc,
91
+ state.selection.from + 1,
92
+ state.selection.from + 1
93
+ )
94
+ )
95
+ dispatch(tr)
96
+ return true
97
+ } else {
98
+ return ArrowDown(state, dispatch, getNode, view, getPos)
99
+ }
100
+ }
101
+
102
+ const ArrowDown = (_state, _dispatch, getNode, view, getPos) => {
103
+ // We are at the end of the tag input. Move the cursor beyond
104
+ const node = getNode()
105
+ const startPos = getPos(),
106
+ pos = startPos + node.nodeSize + 1
107
+
108
+ const newSelection = nextSelection(view.state, pos, 1)
109
+
110
+ if (!newSelection) {
111
+ return false
112
+ }
113
+
114
+ view.dispatch(view.state.tr.setSelection(newSelection))
115
+ view.focus()
116
+ return true
117
+ }
118
+
119
+ export const createTagEditor = (view, getPos, getNode) => {
120
+ const dom = document.createElement("div")
121
+ dom.classList.add("tag-input")
122
+ dom.setAttribute("contenteditable", false)
123
+ const node = getNode()
124
+
125
+ const tagInputView = new EditorView(dom, {
126
+ state: EditorState.create({
127
+ schema,
128
+ doc: schema.nodeFromJSON({
129
+ type: "doc",
130
+ content: [
131
+ {
132
+ type: "tag",
133
+ content: []
134
+ }
135
+ ]
136
+ }),
137
+ plugins: [
138
+ history(),
139
+ placeholderPlugin(node.attrs.item_title),
140
+ pastePlugin(view),
141
+ keymap({
142
+ "Mod-z": undo,
143
+ "Mod-shift-z": undo,
144
+ "Mod-y": redo,
145
+ Enter: (_state, _dispatch, tagInputView) =>
146
+ submitTag(tagInputView, view, getPos),
147
+ ArrowLeft: (state, dispatch, _tagInputView) =>
148
+ ArrowLeft(state, dispatch, getNode, view, getPos),
149
+ ArrowRight: (state, dispatch, _tagInputView) =>
150
+ ArrowRight(state, dispatch, getNode, view, getPos),
151
+ ArrowUp: (state, dispatch, _tagInputView) =>
152
+ ArrowUp(state, dispatch, getNode, view, getPos),
153
+ ArrowDown: (state, dispatch, _tagInputView) =>
154
+ ArrowDown(state, dispatch, getNode, view, getPos)
155
+ })
156
+ ]
157
+ }),
158
+ handleDOMEvents: {
159
+ blur: (tagInputView, event) => {
160
+ // Handle blur event
161
+ event.preventDefault()
162
+ // Set a timeout so that change of focus can take place first
163
+ window.setTimeout(() => {
164
+ // Check if getPos still returns a valid position
165
+ const pos = getPos()
166
+ if (pos !== undefined && pos !== null) {
167
+ submitTag(tagInputView, view, getPos)
168
+ }
169
+ }, 1)
170
+ },
171
+ focus: (tagInputView, _event) => {
172
+ const startPos = getPos(),
173
+ pos =
174
+ startPos + view.state.doc.nodeAt(startPos).nodeSize - 1,
175
+ $pos = view.state.doc.resolve(pos)
176
+ view.dispatch(
177
+ view.state.tr.setSelection(new TextSelection($pos))
178
+ )
179
+ tagInputView.focus()
180
+ }
181
+ },
182
+ handleTextInput: (_view, _from, _to, text) => {
183
+ if ([",", ".", ";"].includes(text)) {
184
+ submitTag(tagInputView, view, getPos)
185
+ return true
186
+ }
187
+ },
188
+ dispatchTransaction: tr => {
189
+ const newState = tagInputView.state.apply(tr)
190
+ tagInputView.updateState(newState)
191
+ }
192
+ })
193
+
194
+ // Store references in WeakMap for access from the plugin
195
+ tagInputReferences.set(dom, {
196
+ tagInputView,
197
+ mainView: view,
198
+ getPos
199
+ })
200
+
201
+ return [dom, tagInputView]
202
+ }
@@ -0,0 +1,74 @@
1
+ import {Plugin} from "prosemirror-state"
2
+ import {Decoration, DecorationSet} from "prosemirror-view"
3
+
4
+ export const placeholderPlugin = nodeTitle =>
5
+ new Plugin({
6
+ props: {
7
+ decorations: state => {
8
+ const doc = state.doc
9
+ if (
10
+ doc.childCount === 1 &&
11
+ doc.firstChild.isTextblock &&
12
+ doc.firstChild.content.size === 0
13
+ ) {
14
+ const placeHolder = document.createElement("span")
15
+ placeHolder.classList.add("fw-placeholder")
16
+ // There is only one field, so we know the selection is there
17
+ placeHolder.classList.add("fw-selected")
18
+ placeHolder.setAttribute(
19
+ "data-placeholder",
20
+ `${gettext("Add")} ${nodeTitle.toLowerCase()}...`
21
+ )
22
+ return DecorationSet.create(doc, [
23
+ Decoration.widget(1, placeHolder)
24
+ ])
25
+ }
26
+ }
27
+ }
28
+ })
29
+
30
+ export const pastePlugin = editorView => {
31
+ return new Plugin({
32
+ props: {
33
+ handleDOMEvents: {
34
+ paste(_view, event) {
35
+ const html = event.clipboardData.getData("text/html"),
36
+ text = event.clipboardData.getData("text/plain"),
37
+ slice = text
38
+ .split(/[,;.]/)
39
+ .map(item => item.trim())
40
+ .filter(item => item.length)
41
+ let tags
42
+ if (text && !html) {
43
+ tags = slice
44
+ } else {
45
+ // Make a paste DOM document
46
+ const clipboardDoc =
47
+ document.implementation.createHTMLDocument(
48
+ "paste document"
49
+ )
50
+ const pasteHTML = document.createElement("body")
51
+ clipboardDoc.body.appendChild(pasteHTML)
52
+ pasteHTML.innerHTML = html
53
+ tags = Array.from(
54
+ pasteHTML.querySelectorAll("span.tag")
55
+ ).map(tag => tag.textContent)
56
+ }
57
+ if (!tags.length) {
58
+ return
59
+ }
60
+ const pos = editorView.state.selection.from
61
+ const tr = editorView.state.tr
62
+ tags.reverse().forEach(tag => {
63
+ const node = editorView.state.schema.nodes.tag.create({
64
+ tag
65
+ })
66
+ tr.insert(pos, node)
67
+ })
68
+ editorView.dispatch(tr)
69
+ return true
70
+ }
71
+ }
72
+ }
73
+ })
74
+ }