@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,209 @@
1
+ import {addAlert, postJson} from "fwtoolkit"
2
+ import {receiveTransaction} from "prosemirror-collab"
3
+ import {Transform} from "prosemirror-transform"
4
+ import {recreateTransform} from "../collab/merge/recreate_transform"
5
+
6
+ /**
7
+ * Handles periodic saving and conflict resolution for the editor
8
+ when EDITOR_SAVE_MODE is "direct" (no WebSocket).
9
+ */
10
+ export class NoCollabSave {
11
+ constructor(editor) {
12
+ this.editor = editor
13
+ this.saveInterval = null
14
+ this.savePromise = null
15
+ this._beforeUnloadHandler = null
16
+ this._lastSaveTime = 0
17
+ }
18
+
19
+ start() {
20
+ if (this.saveInterval) {
21
+ return
22
+ }
23
+ // Save every 10 seconds when the document is loaded and writable.
24
+ this.saveInterval = window.setInterval(() => {
25
+ if (
26
+ !this.editor.waitingForDocument &&
27
+ !this.savePromise &&
28
+ this.editor.docInfo.access_rights === "write" &&
29
+ this._hasUnsavedChanges()
30
+ ) {
31
+ this.save()
32
+ }
33
+ }, 10000)
34
+
35
+ // For non-E2EE documents, try to save on tab close / page hide.
36
+ // E2EE encryption is async and cannot run reliably in unload handlers.
37
+ if (!this.editor.e2ee?.encrypted) {
38
+ this._beforeUnloadHandler = () => {
39
+ if (
40
+ this.editor.docInfo.access_rights === "write" &&
41
+ this._hasUnsavedChanges()
42
+ ) {
43
+ this._save(true)
44
+ }
45
+ }
46
+ window.addEventListener("beforeunload", this._beforeUnloadHandler)
47
+ window.addEventListener("pagehide", this._beforeUnloadHandler)
48
+ }
49
+ }
50
+
51
+ stop() {
52
+ if (this.saveInterval) {
53
+ window.clearInterval(this.saveInterval)
54
+ this.saveInterval = null
55
+ }
56
+ if (this._beforeUnloadHandler) {
57
+ window.removeEventListener(
58
+ "beforeunload",
59
+ this._beforeUnloadHandler
60
+ )
61
+ window.removeEventListener("pagehide", this._beforeUnloadHandler)
62
+ this._beforeUnloadHandler = null
63
+ }
64
+ }
65
+
66
+ async save() {
67
+ if (this.savePromise) {
68
+ return this.savePromise
69
+ }
70
+ this.savePromise = this._save()
71
+ try {
72
+ await this.savePromise
73
+ } finally {
74
+ this.savePromise = null
75
+ }
76
+ }
77
+
78
+ _hasUnsavedChanges() {
79
+ return this.editor.docInfo.updated.getTime() > this._lastSaveTime
80
+ }
81
+
82
+ async _save(keepalive = false) {
83
+ if (this.editor.docInfo.access_rights !== "write") {
84
+ return
85
+ }
86
+ const doc = this.editor.getDoc({use_current_view: true})
87
+ let payload = {
88
+ id: this.editor.docInfo.id,
89
+ content: doc.content,
90
+ comments: this.editor.mod.comments.store.comments,
91
+ bibliography: this.editor.mod.db.bibDB.db,
92
+ title: doc.title,
93
+ version: this.editor.docInfo.version,
94
+ image_updates: this.editor.mod.db.imageDB.unsentEvents()
95
+ }
96
+
97
+ if (
98
+ this.editor.e2ee &&
99
+ this.editor.e2ee.encrypted &&
100
+ this.editor.e2ee.snapshotManager
101
+ ) {
102
+ const snapshot =
103
+ await this.editor.e2ee.snapshotManager.getEncryptedSnapshot()
104
+ if (snapshot) {
105
+ payload = {
106
+ id: this.editor.docInfo.id,
107
+ content: snapshot.content,
108
+ comments: snapshot.comments,
109
+ bibliography: snapshot.bibliography,
110
+ title: snapshot.title,
111
+ version: snapshot.v,
112
+ e2ee_salt: snapshot.e2ee_salt,
113
+ e2ee_iterations: snapshot.e2ee_iterations,
114
+ e2ee_snapshot_version: snapshot.v
115
+ }
116
+ }
117
+ }
118
+
119
+ try {
120
+ const {json, status} = await postJson(
121
+ "/api/document/save/",
122
+ payload,
123
+ {},
124
+ {keepalive}
125
+ )
126
+ if (status === 409) {
127
+ if (!keepalive) {
128
+ await this._handleVersionConflict()
129
+ }
130
+ return
131
+ }
132
+ if (json.version !== undefined) {
133
+ this.editor.docInfo.version = json.version
134
+ }
135
+ this.editor.docInfo.updated = new Date()
136
+ this.editor.docInfo.confirmedDoc = this.editor.view.state.doc
137
+ this._lastSaveTime = Date.now()
138
+ // Clear unsent event queues since the full state has been saved.
139
+ this.editor.mod.db.bibDB.unsent = []
140
+ this.editor.mod.db.imageDB.unsent = []
141
+ this.editor.mod.comments.store.unsent = []
142
+ } catch (error) {
143
+ if (!keepalive) {
144
+ console.error("Failed to save document:", error)
145
+ addAlert("error", gettext("Could not save document."))
146
+ }
147
+ }
148
+ }
149
+
150
+ async _handleVersionConflict() {
151
+ if (this.editor.docInfo.access_rights !== "write") {
152
+ return
153
+ }
154
+ const payload = {id: this.editor.docInfo.id}
155
+ if (this.editor.docInfo.token) {
156
+ payload.token = this.editor.docInfo.token
157
+ }
158
+ try {
159
+ const {json} = await postJson(
160
+ "/api/document/get_doc_data/",
161
+ payload
162
+ )
163
+ const serverDoc = this.editor.schema.nodeFromJSON(json.doc.content)
164
+ const currentDoc = this.editor.view.state.doc
165
+ const confirmedDoc = this.editor.docInfo.confirmedDoc
166
+
167
+ const remoteTr = recreateTransform(confirmedDoc, serverDoc)
168
+ const localTr = recreateTransform(confirmedDoc, currentDoc)
169
+
170
+ const mappedSteps = []
171
+ remoteTr.steps.forEach(step => {
172
+ const mapped = step.map(localTr.mapping)
173
+ if (mapped) {
174
+ mappedSteps.push(mapped)
175
+ }
176
+ })
177
+
178
+ if (mappedSteps.length) {
179
+ this.editor.view.dispatch(
180
+ receiveTransaction(
181
+ this.editor.view.state,
182
+ mappedSteps,
183
+ mappedSteps.map(() => "remote")
184
+ ).setMeta("remote", true)
185
+ )
186
+ }
187
+
188
+ // Update metadata from server
189
+ this.editor.mod.db.bibDB.setDB(json.doc.bibliography)
190
+ this.editor.mod.db.imageDB.setDB(json.doc.images)
191
+ this.editor.mod.comments.store.loadComments(json.doc.comments)
192
+ this.editor.docInfo.version = json.doc.v
193
+ this.editor.docInfo.confirmedDoc = this.editor.view.state.doc
194
+ this.editor.docInfo.updated = new Date(json.time)
195
+ this.editor.mod.footnotes.fnEditor.renderAllFootnotes()
196
+
197
+ // Retry save with the merged document
198
+ await this.save()
199
+ } catch (error) {
200
+ console.error("Failed to handle version conflict:", error)
201
+ addAlert(
202
+ "error",
203
+ gettext(
204
+ "Document has been modified by another user. Please reload the page."
205
+ )
206
+ )
207
+ }
208
+ }
209
+ }
@@ -0,0 +1 @@
1
+ export const plugins = []
@@ -0,0 +1 @@
1
+ export const plugins = []
@@ -0,0 +1,47 @@
1
+ import {Plugin, PluginKey} from "prosemirror-state"
2
+ import {COMMENT_ONLY_ROLES, READ_ONLY_ROLES} from ".."
3
+
4
+ const key = new PluginKey("accessRights")
5
+
6
+ export const accessRightsPlugin = options =>
7
+ new Plugin({
8
+ key,
9
+ filterTransaction: (tr, _state) => {
10
+ let allowed = true
11
+ const remote = tr.getMeta("remote")
12
+ if (remote) {
13
+ return allowed
14
+ }
15
+
16
+ if (
17
+ READ_ONLY_ROLES.includes(
18
+ options.editor.docInfo.access_rights
19
+ ) &&
20
+ tr.docChanged
21
+ ) {
22
+ // User only has read access. Don't allow anything.
23
+ allowed = false
24
+ } else if (
25
+ COMMENT_ONLY_ROLES.includes(
26
+ options.editor.docInfo.access_rights
27
+ )
28
+ ) {
29
+ //User has a comment-only role (commentator, editor or reviewer)
30
+
31
+ //Check all transaction steps. If step type not allowed = prohibit
32
+ //check if in allowed array. if false - exit loop
33
+ if (
34
+ !tr.steps.every(
35
+ step =>
36
+ (step.jsonID === "addMark" ||
37
+ step.jsonID === "removeMark") &&
38
+ step.mark.type.name === "comment"
39
+ )
40
+ ) {
41
+ allowed = false
42
+ }
43
+ }
44
+
45
+ return allowed
46
+ }
47
+ })
@@ -0,0 +1,88 @@
1
+ import {Plugin, PluginKey} from "prosemirror-state"
2
+ import {ReplaceAroundStep, ReplaceStep} from "prosemirror-transform"
3
+
4
+ const key = new PluginKey("citationRender")
5
+
6
+ export const citationRenderPlugin = options =>
7
+ new Plugin({
8
+ key,
9
+ state: {
10
+ init() {
11
+ return {action: false}
12
+ },
13
+ apply(tr, _prev, oldState, _state) {
14
+ const meta = tr.getMeta(key)
15
+ if (meta) {
16
+ // There has been an update, return values from meta instead
17
+ // of previous values
18
+ return meta
19
+ }
20
+ let {action} = this.getState(oldState)
21
+
22
+ if (action || tr.getMeta("settings")) {
23
+ return {action} // We already need to reset the bibliography or another setting is used. Don't bother checking for more reasons to do so.
24
+ }
25
+ tr.steps.forEach((step, index) => {
26
+ if (
27
+ step instanceof ReplaceStep ||
28
+ step instanceof ReplaceAroundStep
29
+ ) {
30
+ if (step.from !== step.to) {
31
+ tr.docs[index].nodesBetween(
32
+ step.from,
33
+ step.to,
34
+ node => {
35
+ if (node.type.name === "citation") {
36
+ // A citation was replaced. We need to reset
37
+ action = "reset"
38
+ } else if (
39
+ !action &&
40
+ node.type.name === "footnote"
41
+ ) {
42
+ action = "numbers"
43
+ }
44
+ }
45
+ )
46
+ }
47
+ if (step.slice?.content) {
48
+ step.slice.content.descendants(node => {
49
+ if (node.type.name === "citation") {
50
+ // A citation was added. We need to reset
51
+ action = "reset"
52
+ } else if (
53
+ !action &&
54
+ node.type.name === "footnote"
55
+ ) {
56
+ action = "numbers"
57
+ }
58
+ })
59
+ }
60
+ }
61
+ })
62
+
63
+ return {action}
64
+ }
65
+ },
66
+ view(_view) {
67
+ options.editor.mod.citations.resetCitations()
68
+ return {
69
+ update: (view, _prevState) => {
70
+ const {action} = key.getState(view.state)
71
+ if (action === "reset") {
72
+ options.editor.mod.citations.resetCitations()
73
+ const tr = view.state.tr.setMeta(key, {action: false})
74
+ view.dispatch(tr)
75
+ } else if (action === "numbers") {
76
+ options.editor.mod.citations.footnoteNumberOverride()
77
+ const tr = view.state.tr.setMeta(key, {action: false})
78
+ view.dispatch(tr)
79
+ } else if (view.dom.querySelector(".citation:empty")) {
80
+ options.editor.mod.citations.resetCitations()
81
+ }
82
+ },
83
+ destroy: () => {
84
+ options.editor.mod.citations.resetCitations()
85
+ }
86
+ }
87
+ }
88
+ })
@@ -0,0 +1,289 @@
1
+ import fixUTF8 from "fix-utf8"
2
+
3
+ import {Fragment, Slice} from "prosemirror-model"
4
+ import {Plugin, PluginKey, TextSelection} from "prosemirror-state"
5
+ import {ReplaceStep} from "prosemirror-transform"
6
+
7
+ import {docClipboardSerializer, fnClipboardSerializer} from "../clipboard/copy"
8
+ import {HTMLPaste, TextPaste} from "../clipboard/paste"
9
+ import {getAllowedElementsAndMarks} from "./document_template"
10
+
11
+ const key = new PluginKey("clipboard")
12
+
13
+ export const getPasteRange = state => {
14
+ const {pasteRange} = key.getState(state)
15
+ return pasteRange
16
+ }
17
+
18
+ export const resetPasteRange = tr => {
19
+ tr.setMeta(key, {pasteRange: null})
20
+ }
21
+
22
+ // Filter a fragment to only include allowed nodes and marks
23
+ // parentNode is optional - used to check if converted nodes are valid children
24
+ const filterFragment = (
25
+ fragment,
26
+ allowedElements,
27
+ allowedMarks,
28
+ schema,
29
+ parentNode = null
30
+ ) => {
31
+ const nodes = []
32
+
33
+ fragment.forEach(node => {
34
+ // Check if this node type is allowed
35
+ const nodeTypeAllowed =
36
+ !allowedElements || allowedElements.includes(node.type.name)
37
+
38
+ if (!nodeTypeAllowed) {
39
+ // Try to convert to paragraph if allowed
40
+ if (
41
+ allowedElements &&
42
+ allowedElements.includes("paragraph") &&
43
+ node.isBlock
44
+ ) {
45
+ const paragraph = schema.nodes.paragraph
46
+ if (paragraph) {
47
+ // Check if paragraph can be a child of the parent node
48
+ const canUseParagraph =
49
+ !parentNode ||
50
+ parentNode.type.contentMatch.matchType(paragraph)
51
+
52
+ if (canUseParagraph) {
53
+ // Convert the node to a paragraph, recursively filtering its content
54
+ const filteredContent =
55
+ node.content.size > 0
56
+ ? filterFragment(
57
+ node.content,
58
+ allowedElements,
59
+ allowedMarks,
60
+ schema,
61
+ node
62
+ )
63
+ : Fragment.empty
64
+ nodes.push(paragraph.create(null, filteredContent))
65
+ } else if (parentNode && parentNode.isTextblock) {
66
+ // Parent is a text block but doesn't allow paragraphs
67
+ // Extract text content and add as plain text
68
+ const textContent = node.textContent
69
+ if (textContent) {
70
+ nodes.push(schema.text(textContent))
71
+ }
72
+ } else {
73
+ // Can't convert to paragraph, extract and process children
74
+ const filteredContent = filterFragment(
75
+ node.content,
76
+ allowedElements,
77
+ allowedMarks,
78
+ schema,
79
+ parentNode
80
+ )
81
+ filteredContent.forEach(child => nodes.push(child))
82
+ }
83
+ }
84
+ } else if (node.isBlock) {
85
+ // Extract content from disallowed block nodes
86
+ const filteredContent = filterFragment(
87
+ node.content,
88
+ allowedElements,
89
+ allowedMarks,
90
+ schema,
91
+ parentNode
92
+ )
93
+ filteredContent.forEach(child => nodes.push(child))
94
+ } else {
95
+ // For inline nodes, just skip them
96
+ }
97
+ return
98
+ }
99
+
100
+ // Node type is allowed, but filter marks
101
+ let filteredNode = node
102
+ if (allowedMarks !== false && node.marks.length > 0) {
103
+ const filteredMarks = node.marks.filter(mark =>
104
+ allowedMarks.includes(mark.type.name)
105
+ )
106
+ if (filteredMarks.length !== node.marks.length) {
107
+ filteredNode = node.mark(filteredMarks)
108
+ }
109
+ }
110
+
111
+ // Recursively filter content
112
+ if (filteredNode.content.size > 0) {
113
+ const filteredContent = filterFragment(
114
+ filteredNode.content,
115
+ allowedElements,
116
+ allowedMarks,
117
+ schema,
118
+ filteredNode
119
+ )
120
+ filteredNode = filteredNode.copy(filteredContent)
121
+ }
122
+
123
+ nodes.push(filteredNode)
124
+ })
125
+
126
+ return Fragment.from(nodes)
127
+ }
128
+
129
+ export const clipboardPlugin = options => {
130
+ let shiftPressed = false
131
+ return new Plugin({
132
+ key,
133
+ state: {
134
+ init() {
135
+ return {
136
+ pasteRange: null
137
+ }
138
+ },
139
+ apply(tr, _prev, oldState, _state) {
140
+ const meta = tr.getMeta(key)
141
+ if (meta) {
142
+ // There has been an update, return values from meta instead
143
+ // of previous values
144
+ return meta
145
+ }
146
+ const uiEventMeta = tr.getMeta("uiEvent")
147
+ let pasteRange
148
+ if (uiEventMeta && ["paste", "drop"].includes(uiEventMeta)) {
149
+ pasteRange = [
150
+ oldState.selection.from,
151
+ oldState.selection.to
152
+ ]
153
+ tr.steps.forEach(step => {
154
+ if (step instanceof ReplaceStep) {
155
+ // paste and drop TRs will usually just consist of a single ReplaceStep
156
+ pasteRange = [step.from, step.to]
157
+ }
158
+ const stepMap = step.getMap()
159
+ pasteRange = [
160
+ stepMap.map(pasteRange[0], -1),
161
+ stepMap.map(pasteRange[1], 1)
162
+ ] // map through step
163
+ })
164
+ } else {
165
+ pasteRange = this.getState(oldState)?.pasteRange
166
+ if (pasteRange && tr.docChanged) {
167
+ const from = tr.mapping.mapResult(pasteRange[0], -1)
168
+ const to = tr.mapping.mapResult(pasteRange[1], 1)
169
+ if (from.deleted || to.deleted) {
170
+ pasteRange = null
171
+ } else {
172
+ pasteRange = [from.pos, to.pos]
173
+ }
174
+ }
175
+ }
176
+
177
+ return {
178
+ pasteRange
179
+ }
180
+ }
181
+ },
182
+ props: {
183
+ handleKeyDown: (_view, event) => {
184
+ shiftPressed = event.shiftKey
185
+ return false
186
+ },
187
+ handleDrop: (view, event, slice, moved) => {
188
+ shiftPressed = event.shiftKey
189
+ if (moved || (slice && slice.size)) {
190
+ return false // Something other than en empty plain text string from outside. Handled by PM already.
191
+ }
192
+ const eventPos = view.posAtCoords({
193
+ left: event.clientX,
194
+ top: event.clientY
195
+ })
196
+ if (!eventPos) {
197
+ return false
198
+ }
199
+ const $mouse = view.state.doc.resolve(eventPos.pos)
200
+ if (!$mouse) {
201
+ return false
202
+ }
203
+ const tr = view.state.tr
204
+ tr.setSelection(new TextSelection($mouse))
205
+ view.dispatch(tr)
206
+ return true
207
+ },
208
+ transformPastedHTML: (inHTML, view) => {
209
+ const {pasteRange} = key.getState(view.state)
210
+
211
+ if (pasteRange) {
212
+ // a previous paste operation has been interrupted by a new one. Cancel.
213
+ return ""
214
+ }
215
+ if (shiftPressed) {
216
+ return inHTML
217
+ }
218
+ const ph = new HTMLPaste(
219
+ options.editor,
220
+ inHTML,
221
+ options.viewType,
222
+ view
223
+ )
224
+ return ph.getOutput()
225
+ },
226
+ transformPastedText: (inText, _plain, view) => {
227
+ const {pasteRange} = key.getState(view.state)
228
+
229
+ if (pasteRange) {
230
+ // a previous paste operation has been interrupted by a new one. Cancel.
231
+ return ""
232
+ }
233
+ if (shiftPressed) {
234
+ return inText
235
+ }
236
+ // Chrome on Linux has an encoding problem:
237
+ // it recognizes UTF as Windows 1252. Bug has been filed. This is a temp
238
+ // solution for western European languages.
239
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=760613
240
+ const fixedText = fixUTF8(inText)
241
+ const ph = new TextPaste(
242
+ options.editor,
243
+ fixedText,
244
+ options.editor.currentView
245
+ )
246
+ ph.init()
247
+ return fixedText // We need to analyze it asynchronously, so we always need to turn this into an empty string for now.
248
+ },
249
+ clipboardSerializer:
250
+ options.viewType === "main"
251
+ ? docClipboardSerializer(options.editor)
252
+ : fnClipboardSerializer(options.editor),
253
+ transformPasted: (slice, view, plain) => {
254
+ // Only filter if not plain text paste
255
+ if (plain) {
256
+ return slice
257
+ }
258
+
259
+ // Get allowed elements and marks at the current selection position
260
+ const {elements, marks} = getAllowedElementsAndMarks(view.state)
261
+
262
+ // If no restrictions, return slice unchanged
263
+ if (elements === false && marks === false) {
264
+ return slice
265
+ }
266
+
267
+ // Get the parent node at the selection position to check compatibility
268
+ const $pos = view.state.selection.$from
269
+ const parentNode = $pos.parent
270
+
271
+ // Filter the slice content
272
+ const filteredContent = filterFragment(
273
+ slice.content,
274
+ elements,
275
+ marks,
276
+ view.state.schema,
277
+ parentNode
278
+ )
279
+
280
+ // Return new slice with filtered content
281
+ return new Slice(
282
+ filteredContent,
283
+ slice.openStart,
284
+ slice.openEnd
285
+ )
286
+ }
287
+ }
288
+ })
289
+ }