@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,201 @@
1
+ import {ContentMenu} from "fwtoolkit"
2
+ import {DOMSerializer} from "prosemirror-model"
3
+ import {NodeSelection, Plugin, PluginKey} from "prosemirror-state"
4
+
5
+ const key = new PluginKey("codeBlockMenu")
6
+
7
+ class CodeBlockView {
8
+ constructor(node, view, getPos, options) {
9
+ this.node = node
10
+ this.view = view
11
+ this.getPos = getPos
12
+ this.options = options
13
+ this.dom = document.createElement("div")
14
+ this.dom.classList.add("code-block-wrapper")
15
+
16
+ // Add category label and title if present
17
+ if (this.node.attrs.category || this.node.attrs.title) {
18
+ this.addLabel()
19
+ }
20
+
21
+ // Use DOMSerializer to create the content
22
+ this.serializer = DOMSerializer.fromSchema(node.type.schema)
23
+ const preElement = this.serializer.serializeNode(this.node)
24
+ preElement.classList.forEach(className =>
25
+ this.dom.classList.add(className)
26
+ )
27
+ preElement.classList.value = ""
28
+ this.dom.appendChild(preElement)
29
+
30
+ // The contentDOM should be the <code> element inside <pre>
31
+ this.contentDOM = preElement.querySelector("code")
32
+
33
+ // Add menu button
34
+ this.menuButton = document.createElement("button")
35
+ this.menuButton.classList.add("code-block-menu-btn")
36
+ this.menuButton.innerHTML =
37
+ '<span class="dot-menu-icon"><i class="fa-solid fa-ellipsis-v"></i></span>'
38
+ this.dom.insertBefore(this.menuButton, this.dom.firstChild)
39
+
40
+ // Add language badge if language is set
41
+ if (this.node.attrs.language) {
42
+ this.addLanguageBadge()
43
+ }
44
+ }
45
+
46
+ addLabel() {
47
+ const {category, title, id} = this.node.attrs
48
+ const language = this.view.state.doc.attrs.language
49
+ const categories = {}
50
+
51
+ // Count code blocks by category
52
+ this.view.state.doc.descendants(node => {
53
+ if (node.attrs.track?.find(track => track.type === "deletion")) {
54
+ return true
55
+ }
56
+ if (
57
+ node.type.name === "code_block" &&
58
+ node.attrs.category &&
59
+ node.attrs.id
60
+ ) {
61
+ if (!categories[node.attrs.category]) {
62
+ categories[node.attrs.category] = 0
63
+ }
64
+ categories[node.attrs.category]++
65
+
66
+ if (node.attrs.id === id) {
67
+ // Found our position, stop counting
68
+ return false
69
+ }
70
+ }
71
+ })
72
+
73
+ const label = document.createElement("div")
74
+ label.classList.add("code-block-label")
75
+
76
+ if (category && id) {
77
+ label.dataset.id = id
78
+ const {CATS} = require("@fiduswriter/document/schema/i18n")
79
+ const categoryLabel = CATS[category]?.[language] || category
80
+ const number = categories[category] || 1
81
+
82
+ const labelText = title
83
+ ? `${categoryLabel} ${number}: ${title}`
84
+ : `${categoryLabel} ${number}`
85
+
86
+ label.innerHTML = `<span class="label-text">${labelText}</span>`
87
+ } else if (title) {
88
+ // Title without category
89
+ label.innerHTML = `<span class="label-text">${title}</span>`
90
+ }
91
+
92
+ this.dom.appendChild(label)
93
+ }
94
+
95
+ addLanguageBadge() {
96
+ const badge = document.createElement("div")
97
+ badge.classList.add("code-block-language-badge")
98
+ badge.textContent = this.node.attrs.language
99
+ this.dom.appendChild(badge)
100
+ }
101
+
102
+ stopEvent(event) {
103
+ let stopped = false
104
+ if (event.type === "mousedown") {
105
+ const composedPath = event.composedPath()
106
+ if (composedPath.includes(this.menuButton)) {
107
+ stopped = true
108
+ const tr = this.view.state.tr
109
+ const $pos = this.view.state.doc.resolve(this.getPos())
110
+ tr.setSelection(new NodeSelection($pos))
111
+ this.view.dispatch(tr)
112
+ const contentMenu = new ContentMenu({
113
+ menu: this.options.editor.menu.codeBlockMenuModel,
114
+ width: 280,
115
+ page: this.options.editor,
116
+ menuPos: {
117
+ X: Number.parseInt(event.pageX) + 20,
118
+ Y: Number.parseInt(event.pageY) - 100
119
+ },
120
+ onClose: () => {
121
+ this.view.focus()
122
+ }
123
+ })
124
+ contentMenu.open()
125
+ } else if (
126
+ composedPath.includes(this.dom) &&
127
+ !composedPath.find(el => el.matches && el.matches("code"))
128
+ ) {
129
+ stopped = true
130
+ const tr = this.view.state.tr
131
+ const $pos = this.view.state.doc.resolve(this.getPos())
132
+ tr.setSelection(new NodeSelection($pos))
133
+ this.view.dispatch(tr)
134
+ }
135
+ }
136
+
137
+ return stopped
138
+ }
139
+
140
+ update(node) {
141
+ if (node.type !== this.node.type) {
142
+ return false
143
+ }
144
+
145
+ const oldNode = this.node
146
+ this.node = node
147
+
148
+ // Update language badge if changed
149
+ if (node.attrs.language !== oldNode.attrs.language) {
150
+ const existingBadge = this.dom.querySelector(
151
+ ".code-block-language-badge"
152
+ )
153
+ if (existingBadge) {
154
+ existingBadge.remove()
155
+ }
156
+ if (node.attrs.language) {
157
+ this.addLanguageBadge()
158
+ }
159
+ }
160
+
161
+ // Update label if category, title, or id changed
162
+ if (
163
+ node.attrs.category !== oldNode.attrs.category ||
164
+ node.attrs.title !== oldNode.attrs.title ||
165
+ node.attrs.id !== oldNode.attrs.id
166
+ ) {
167
+ const existingLabel = this.dom.querySelector(".code-block-label")
168
+ if (existingLabel) {
169
+ existingLabel.remove()
170
+ }
171
+ if (node.attrs.category || node.attrs.title) {
172
+ this.addLabel()
173
+ }
174
+ }
175
+
176
+ return true
177
+ }
178
+ }
179
+
180
+ export const codeBlockPlugin = options =>
181
+ new Plugin({
182
+ key,
183
+ state: {
184
+ init(_config, _state) {
185
+ if (options.editor.docInfo.access_rights === "write") {
186
+ this.spec.props.nodeViews["code_block"] = (
187
+ node,
188
+ view,
189
+ getPos
190
+ ) => new CodeBlockView(node, view, getPos, options)
191
+ }
192
+ return {}
193
+ },
194
+ apply(_tr, prev) {
195
+ return prev
196
+ }
197
+ },
198
+ props: {
199
+ nodeViews: {}
200
+ }
201
+ })
@@ -0,0 +1,152 @@
1
+ import {sendableSteps} from "prosemirror-collab"
2
+ import {Plugin, PluginKey} from "prosemirror-state"
3
+ import {Decoration, DecorationSet} from "prosemirror-view"
4
+
5
+ const key = new PluginKey("collabCarets")
6
+
7
+ export const getSelectionUpdate = state => {
8
+ const {caretUpdate} = key.getState(state)
9
+ return caretUpdate
10
+ }
11
+
12
+ export const updateCollaboratorSelection = (state, collaborator, data) => {
13
+ let {decos, caretPositions} = key.getState(state)
14
+
15
+ const oldCarPos = caretPositions.find(
16
+ carPos => carPos.sessionId === data.session_id
17
+ )
18
+
19
+ if (oldCarPos) {
20
+ caretPositions = caretPositions.filter(carPos => carPos !== oldCarPos)
21
+ const removeDecos = decos
22
+ .find()
23
+ .filter(deco => deco.spec === oldCarPos.decoSpec)
24
+ decos = decos.remove(removeDecos)
25
+ }
26
+
27
+ const widgetDom = document.createElement("div")
28
+ const className = `user-${collaborator.id}`
29
+ widgetDom.classList.add("caret")
30
+ widgetDom.classList.add(className)
31
+ widgetDom.innerHTML = '<div class="caret-head"></div>'
32
+ widgetDom.firstChild.classList.add(className)
33
+ const tooltip = collaborator.name
34
+ widgetDom.title = tooltip
35
+ widgetDom.firstChild.title = tooltip
36
+ const decoSpec = {id: data.session_id} // We will compare the decoSpec object. Id not really needed.
37
+ const newCarPos = {
38
+ sessionId: data.session_id,
39
+ userId: collaborator.id,
40
+ decoSpec,
41
+ anchor: data.anchor,
42
+ head: data.head
43
+ }
44
+ caretPositions.push(newCarPos)
45
+
46
+ const widgetDeco = Decoration.widget(data.head, widgetDom, decoSpec),
47
+ addDecos = [widgetDeco]
48
+
49
+ if (data.anchor !== data.head) {
50
+ const from = data.head > data.anchor ? data.anchor : data.head,
51
+ to = data.anchor > data.head ? data.anchor : data.head,
52
+ inlineDeco = Decoration.inline(
53
+ from,
54
+ to,
55
+ {
56
+ class: `user-bg-${collaborator.id}`
57
+ },
58
+ decoSpec
59
+ )
60
+ addDecos.push(inlineDeco)
61
+ }
62
+ decos = decos.add(state.doc, addDecos)
63
+
64
+ const tr = state.tr.setMeta(key, {
65
+ decos,
66
+ caretPositions,
67
+ caretUpdate: false
68
+ })
69
+ return tr
70
+ }
71
+
72
+ export const removeCollaboratorSelection = (state, data) => {
73
+ let {decos, caretPositions} = key.getState(state)
74
+
75
+ const caretPosition = caretPositions.find(
76
+ carPos => carPos.sessionId === data.session_id
77
+ )
78
+
79
+ if (caretPosition) {
80
+ caretPositions = caretPositions.filter(
81
+ carPos => carPos !== caretPosition
82
+ )
83
+ const removeDecos = decos
84
+ .find()
85
+ .filter(deco => deco.spec === caretPosition.decoSpec)
86
+ decos = decos.remove(removeDecos)
87
+ const tr = state.tr.setMeta(key, {
88
+ decos,
89
+ caretPositions,
90
+ caretUpdate: false
91
+ })
92
+ return tr
93
+ }
94
+ return false
95
+ }
96
+
97
+ export const collabCaretsPlugin = options =>
98
+ new Plugin({
99
+ key,
100
+ state: {
101
+ init() {
102
+ return {
103
+ caretPositions: [],
104
+ decos: DecorationSet.empty,
105
+ caretUpdate: false
106
+ }
107
+ },
108
+ apply(tr, _prev, oldState, state) {
109
+ const meta = tr.getMeta(key)
110
+ if (meta) {
111
+ // There has been an update, return values from meta instead
112
+ // of previous values
113
+ return meta
114
+ }
115
+ let {decos, caretPositions} = this.getState(oldState),
116
+ caretUpdate = false
117
+
118
+ decos = decos.map(tr.mapping, tr.doc, {
119
+ onRemove: decoSpec => {
120
+ caretPositions = caretPositions.filter(
121
+ carPos => carPos.decoSpec !== decoSpec
122
+ )
123
+ }
124
+ })
125
+
126
+ if (
127
+ tr.selectionSet &&
128
+ !sendableSteps(state) &&
129
+ !["review", "review-tracked"].includes(
130
+ options.editor.docInfo.access_rights
131
+ )
132
+ ) {
133
+ caretUpdate = {
134
+ anchor: tr.selection.anchor,
135
+ head: tr.selection.head
136
+ }
137
+ }
138
+
139
+ return {
140
+ decos,
141
+ caretPositions,
142
+ caretUpdate
143
+ }
144
+ }
145
+ },
146
+ props: {
147
+ decorations(state) {
148
+ const {decos} = this.getState(state)
149
+ return decos
150
+ }
151
+ }
152
+ })
@@ -0,0 +1,259 @@
1
+ import {Plugin, PluginKey} from "prosemirror-state"
2
+ import {AddMarkStep} from "prosemirror-transform"
3
+ import {Decoration, DecorationSet} from "prosemirror-view"
4
+
5
+ const key = new PluginKey("comments")
6
+
7
+ const commentDuringCreationDecoSpec = {}
8
+
9
+ const moveComment = (doc, id, pos) => {
10
+ // The content to which a comment was linked has been removed.
11
+ // We need to find text close to the position to which we can link
12
+ // comment.
13
+ if (!pos) {
14
+ // The position is linked to the start of the document. The minimum start
15
+ // position is 2
16
+ pos = 2
17
+ }
18
+ let posFrom = pos - 1
19
+ let posTo = pos
20
+ // We move backward through the document, trying to pick a start position
21
+ // the depth is 1 between document parts, and comments should be moved
22
+ // across these.
23
+ // We decrease the from position until there is some text between posFrom
24
+ // and posTo or until we hit the start of the document part.
25
+ while (
26
+ doc.resolve(posFrom).depth > 1 &&
27
+ !doc.textBetween(posFrom, posTo).length &&
28
+ posFrom
29
+ ) {
30
+ posFrom--
31
+ }
32
+ // If we ended up reaching a document part boundary rather than finding
33
+ // text, we try again, this time moving in the opposite direction.
34
+ // We start at the original position and then increase posTo
35
+ if (doc.resolve(posFrom).depth === 1) {
36
+ posFrom = posTo
37
+ posTo++
38
+ while (
39
+ doc.resolve(posTo).depth > 1 &&
40
+ !doc.textBetween(posFrom, posTo).length
41
+ ) {
42
+ posTo++
43
+ }
44
+
45
+ // If also the increase of posTo only made us reach a document part
46
+ // boundary, it means all text has been removed in this document part.
47
+ // Try placing it on the first letter of the title and otherwise give up.
48
+ if (doc.resolve(posTo).depth === 1) {
49
+ if (doc.textBetween(2, 3).length) {
50
+ posFrom = 2
51
+ posTo = 3
52
+ } else {
53
+ return
54
+ }
55
+ }
56
+ }
57
+ const markType = doc.type.schema.marks.comment.create({id})
58
+ return new AddMarkStep(posFrom, posTo, markType)
59
+ }
60
+
61
+ export const addCommentDuringCreationDecoration = (state, tr) => {
62
+ if (!tr.selection.from || tr.selection.from === tr.selection.to) {
63
+ return false
64
+ }
65
+ let {decos} = key.getState(state)
66
+
67
+ const commentDuringCreationDeco = decos.find(
68
+ undefined,
69
+ undefined,
70
+ spec => spec === commentDuringCreationDecoSpec
71
+ )
72
+
73
+ if (commentDuringCreationDeco) {
74
+ decos = decos.remove([commentDuringCreationDeco])
75
+ }
76
+
77
+ decos = decos.add(tr.doc, [
78
+ Decoration.inline(
79
+ tr.selection.from,
80
+ tr.selection.to,
81
+ {class: "active-comment"},
82
+ commentDuringCreationDecoSpec
83
+ )
84
+ ])
85
+
86
+ return tr.setMeta(key, {decos})
87
+ }
88
+
89
+ export const removeCommentDuringCreationDecoration = (state, tr) => {
90
+ let {decos} = key.getState(state)
91
+
92
+ const commentDuringCreationDecos = decos.find(
93
+ undefined,
94
+ undefined,
95
+ spec => spec === commentDuringCreationDecoSpec
96
+ )
97
+
98
+ if (!commentDuringCreationDecos) {
99
+ return false
100
+ }
101
+ decos = decos.remove(commentDuringCreationDecos)
102
+
103
+ return tr.setMeta(key, {decos})
104
+ }
105
+
106
+ export const getCommentDuringCreationDecoration = state => {
107
+ const {decos} = key.getState(state)
108
+
109
+ const deco = decos.find(
110
+ undefined,
111
+ undefined,
112
+ spec => spec === commentDuringCreationDecoSpec
113
+ )
114
+
115
+ if (deco.length) {
116
+ return deco[0]
117
+ } else {
118
+ return false
119
+ }
120
+ }
121
+
122
+ export const commentsPlugin = options =>
123
+ new Plugin({
124
+ key,
125
+ state: {
126
+ init() {
127
+ return {
128
+ decos: DecorationSet.empty
129
+ }
130
+ },
131
+ apply(tr, _prev, oldState, _state) {
132
+ const meta = tr.getMeta(key)
133
+ if (meta) {
134
+ // There has been an update, return values from meta instead
135
+ // of previous values
136
+ return meta
137
+ }
138
+ let {decos} = this.getState(oldState)
139
+
140
+ decos = decos.map(tr.mapping, tr.doc, {
141
+ onRemove: _decoSpec => {
142
+ // comment text has been deleted, cancel comment creation.
143
+ options.editor.mod.comments.interactions.deleteComment(
144
+ -1
145
+ )
146
+ }
147
+ })
148
+
149
+ return {
150
+ decos
151
+ }
152
+ }
153
+ },
154
+ appendTransaction: (trs, _oldState, state) => {
155
+ // Check if any of the transactions are local.
156
+ if (trs.every(tr => tr.getMeta("remote"))) {
157
+ // All transactions are remote. Give up.
158
+ return
159
+ }
160
+
161
+ const deletedComments = {}
162
+ // Check what area is affected
163
+
164
+ trs.forEach(tr => {
165
+ Object.keys(deletedComments).forEach(commentId => {
166
+ // map positions from earlier transactions
167
+ deletedComments[commentId] = tr.mapping.map(
168
+ deletedComments[commentId]
169
+ )
170
+ })
171
+ tr.steps.forEach((step, index) => {
172
+ if (
173
+ step.jsonID === "replace" ||
174
+ step.jsonID === "replaceAround"
175
+ ) {
176
+ if (step.from !== step.to) {
177
+ tr.docs[index].nodesBetween(
178
+ step.from,
179
+ step.to,
180
+ node => {
181
+ node.marks
182
+ .filter(
183
+ mark =>
184
+ mark.type.name === "comment" &&
185
+ mark.attrs.id
186
+ )
187
+ .map(mark => mark.attrs.id)
188
+ .forEach(commentId => {
189
+ if (
190
+ !deletedComments.hasOwnProperty(
191
+ commentId
192
+ )
193
+ ) {
194
+ deletedComments[commentId] =
195
+ step.from
196
+ }
197
+ })
198
+ }
199
+ )
200
+ }
201
+ }
202
+ })
203
+ })
204
+ if (!Object.keys(deletedComments).length) {
205
+ return
206
+ }
207
+
208
+ // We try to see if the deleted comments are still to be found in
209
+ // another part of the document.
210
+ state.doc.descendants(node => {
211
+ if (!node.isInline && !node.isLeaf) {
212
+ return
213
+ }
214
+
215
+ node.marks
216
+ .filter(
217
+ mark => mark.type.name === "comment" && mark.attrs.id
218
+ )
219
+ .map(mark => mark.attrs.id)
220
+ .forEach(commentId => {
221
+ if (deletedComments.hasOwnProperty(commentId)) {
222
+ delete deletedComments[commentId]
223
+ }
224
+ })
225
+ })
226
+ if (!Object.keys(deletedComments).length) {
227
+ return
228
+ }
229
+ let steps = [],
230
+ tr = state.tr
231
+ Object.entries(deletedComments).forEach(([id, pos]) => {
232
+ steps.push(moveComment(state.doc, id, pos))
233
+ })
234
+ if (!steps.every(step => step)) {
235
+ // At least one comment was placed in a part where it couldn't be put,
236
+ // and additionally it could not be put in the title either because it
237
+ // had no content.
238
+ // Add an empty space to the title, increase all positions, by 1, then
239
+ // try again.
240
+ tr = state.tr.insertText(" ", 2)
241
+ state = tr.state
242
+ steps = []
243
+ Object.entries(deletedComments).forEach(([id, pos]) => {
244
+ pos++
245
+ steps.push(moveComment(tr.doc, id, pos))
246
+ })
247
+ // If the step still is not working. give up. This should never happen.
248
+ steps = steps.filter(step => step)
249
+ }
250
+ steps.forEach(step => tr.step(step))
251
+ return tr
252
+ },
253
+ props: {
254
+ decorations(state) {
255
+ const {decos} = this.getState(state)
256
+ return decos
257
+ }
258
+ }
259
+ })