@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,179 @@
1
+ import {BIBLIOGRAPHY_HEADERS} from "@fiduswriter/document/schema/i18n"
2
+ import {DOMSerializer} from "prosemirror-model"
3
+ import {RenderCitations} from "../../../citations/render"
4
+ import {createDocCopySchema, fnCopySchema} from "./schema"
5
+
6
+ // Wrap around DOMSerializer, allowing post processing.
7
+ class ClipboardDOMSerializer {
8
+ constructor(nodes, marks, editor) {
9
+ this.domSerializer = new DOMSerializer(nodes, marks)
10
+ this.editor = editor
11
+ }
12
+
13
+ serializeFragment(fragment, options) {
14
+ const domFragment = this.domSerializer.serializeFragment(
15
+ fragment,
16
+ options
17
+ )
18
+ return this.postProcessFragment(domFragment)
19
+ }
20
+
21
+ postProcessFragment(domFragment) {
22
+ const citationFormatter = this.renderCitations(domFragment)
23
+ this.renderFootnotes(domFragment, citationFormatter)
24
+ this.removeTrackingData(domFragment)
25
+ this.addBaseUrlToImages(domFragment)
26
+ this.addFigureNumbers(domFragment)
27
+ return domFragment
28
+ }
29
+
30
+ renderCitations(domFragment) {
31
+ const settings = this.editor.view.state.doc.attrs,
32
+ bibliographyHeader =
33
+ settings.bibliography_header[settings.language] ||
34
+ BIBLIOGRAPHY_HEADERS[settings.language]
35
+ const citRenderer = new RenderCitations(
36
+ domFragment,
37
+ settings.citationstyle,
38
+ bibliographyHeader,
39
+ this.editor.mod.db.bibDB,
40
+ this.editor.app.csl,
41
+ true // synchronous. Should work as the editor has used the same style previously.
42
+ )
43
+ if (citRenderer.init()) {
44
+ if (citRenderer.fm.bibHTML.length) {
45
+ const bibDiv = document.createElement("div")
46
+ bibDiv.classList.add("fiduswriter-clipboard-bibliography")
47
+ bibDiv.innerHTML = citRenderer.fm.bibHTML
48
+ bibDiv.firstElementChild.innerHTML = gettext("Bibliography")
49
+ domFragment.appendChild(bibDiv)
50
+ }
51
+ return citRenderer.fm
52
+ } else {
53
+ return false
54
+ }
55
+ }
56
+
57
+ renderFootnotes(domFragment, citationFormatter) {
58
+ const footnoteSelector =
59
+ citationFormatter && citationFormatter.citationType === "note"
60
+ ? ".footnote-marker, .citation"
61
+ : ".footnote-marker"
62
+ // Inside of footnote markers add anchors and put footnotes with content
63
+ // at the back of the document.
64
+ // Also, link the footnote anchor with the footnote.
65
+ const footnotes = domFragment.querySelectorAll(footnoteSelector)
66
+ const footnotesContainer = document.createElement("section")
67
+ let citationCount = 0
68
+ footnotesContainer.setAttribute("role", "doc-footnotes")
69
+ footnotesContainer.classList.add("fnlist")
70
+ footnotesContainer.classList.add("fiduswriter-clipboard-footnotes")
71
+ footnotes.forEach((footnote, index) => {
72
+ const counter = index + 1,
73
+ id = this.getRandomID()
74
+ const footnoteAnchor = this.getFootnoteAnchor(counter, id)
75
+ footnote.appendChild(footnoteAnchor)
76
+ const newFootnote = document.createElement("h6") // We use H6 as Wordpress Gutenberg only allows IDs on H1-6 elements.
77
+ newFootnote.setAttribute("role", "doc-footnote")
78
+ newFootnote.innerHTML = footnote.matches(".footnote-marker")
79
+ ? footnote.dataset.footnote
80
+ : `<p>${citationFormatter.citationTexts[citationCount++] || " "}</p>`
81
+ if (
82
+ newFootnote.firstElementChild &&
83
+ newFootnote.firstElementChild.matches("p")
84
+ ) {
85
+ newFootnote.firstElementChild.insertAdjacentHTML(
86
+ "afterbegin",
87
+ `${counter}. `
88
+ )
89
+ } else {
90
+ newFootnote.insertAdjacentHTML(
91
+ "afterbegin",
92
+ `<p>${counter}. </p>`
93
+ )
94
+ }
95
+ newFootnote.id = `fn-${id}`
96
+ footnotesContainer.appendChild(newFootnote)
97
+ })
98
+ if (footnotes.length) {
99
+ domFragment.appendChild(footnotesContainer)
100
+ }
101
+ }
102
+
103
+ addFigureNumbers(domFragment) {
104
+ domFragment
105
+ .querySelectorAll(
106
+ "figure[data-category='figure'] figcaption span.label"
107
+ )
108
+ .forEach((el, index) => {
109
+ el.innerHTML += " " + (index + 1) + ": "
110
+ })
111
+
112
+ domFragment
113
+ .querySelectorAll(
114
+ "figure[data-category='photo'] figcaption span.label"
115
+ )
116
+ .forEach((el, index) => {
117
+ el.innerHTML += " " + (index + 1) + ": "
118
+ })
119
+
120
+ domFragment
121
+ .querySelectorAll(
122
+ "figure[data-category='table'] figcaption span.label"
123
+ )
124
+ .forEach((el, index) => {
125
+ el.innerHTML += " " + (index + 1) + ": "
126
+ })
127
+ }
128
+
129
+ addBaseUrlToImages(domFragment) {
130
+ domFragment
131
+ .querySelectorAll("img")
132
+ .forEach(el => el.setAttribute("src", el.src))
133
+ }
134
+
135
+ getRandomID() {
136
+ return (0 | (Math.random() * 9e6)).toString(36)
137
+ }
138
+
139
+ getFootnoteAnchor(counter, id) {
140
+ const footnoteAnchor = document.createElement("a")
141
+ footnoteAnchor.setAttribute("href", `#fn-${id}`)
142
+ footnoteAnchor.classList.add("fn")
143
+ footnoteAnchor.classList.add("sdfootnoteanc")
144
+ footnoteAnchor.innerHTML = `<sup>${counter}</sup>`
145
+ return footnoteAnchor
146
+ }
147
+
148
+ removeTrackingData(domFragment) {
149
+ domFragment
150
+ .querySelectorAll(".approved-insertion, .insertion")
151
+ .forEach(el => {
152
+ const parent = el.parentNode
153
+ const fragment = document.createDocumentFragment()
154
+ while (el.firstChild) {
155
+ fragment.appendChild(el.firstChild)
156
+ }
157
+ parent.replaceChild(fragment, el)
158
+ })
159
+ domFragment
160
+ .querySelectorAll(".deletion")
161
+ .forEach(el => el.parentElement.removeChild(el))
162
+ }
163
+
164
+ static fromSchema(schema, editor) {
165
+ return new ClipboardDOMSerializer(
166
+ DOMSerializer.nodesFromSchema(schema),
167
+ DOMSerializer.marksFromSchema(schema),
168
+ editor
169
+ )
170
+ }
171
+ }
172
+
173
+ export const docClipboardSerializer = editor =>
174
+ ClipboardDOMSerializer.fromSchema(
175
+ createDocCopySchema(editor.schema),
176
+ editor
177
+ )
178
+ export const fnClipboardSerializer = editor =>
179
+ ClipboardDOMSerializer.fromSchema(fnCopySchema, editor)
@@ -0,0 +1,55 @@
1
+ import {GeneralPasteHandler} from "./general"
2
+
3
+ // Fidus Writer paste handler
4
+ export class FidusWriterPasteHandler extends GeneralPasteHandler {
5
+ // Convert an existing node to a different node, if needed.
6
+ convertNode(node) {
7
+ node = super.convertNode(node)
8
+ // Replace nodes with other nodes to not change the number of child nodes
9
+ // <b style="font-weight:normal;">...</b> => <span>...</span>
10
+ if (node.tagName === "SPAN" && node.classList.contains("citation")) {
11
+ node = this.verifyCitationNode(node)
12
+ }
13
+ return node
14
+ }
15
+
16
+ verifyCitationNode(node) {
17
+ try {
18
+ const bibs = JSON.parse(node.dataset.bibs),
19
+ references = JSON.parse(node.dataset.references),
20
+ bibDB = this.editor.mod.db.bibDB,
21
+ idTranslations = {}
22
+ Object.keys(bibs).forEach(bibKey => {
23
+ const reference = bibs[bibKey]
24
+ const oldKey = bibDB.findReference(reference)
25
+ if (oldKey) {
26
+ idTranslations[bibKey] = oldKey
27
+ } else {
28
+ const newKey = bibDB.addReference(reference, bibKey)
29
+ idTranslations[bibKey] = newKey
30
+ }
31
+ })
32
+
33
+ if (
34
+ Object.entries(idTranslations).every(
35
+ trans => trans[0] === trans[1]
36
+ )
37
+ ) {
38
+ return node
39
+ }
40
+ references.forEach(ref => (ref.id = idTranslations[ref.id]))
41
+ node.dataset.references = JSON.stringify(references)
42
+ return node
43
+ } catch (_error) {
44
+ return node
45
+ }
46
+ }
47
+
48
+ cleanDOM() {
49
+ // Remove the bibliography that was added by the copy serializer
50
+ const clipboardArtifacts = this.dom.querySelectorAll(
51
+ ".fiduswriter-clipboard-bibliography, .fiduswriter-clipboard-footnotes"
52
+ )
53
+ clipboardArtifacts.forEach(el => el.parentElement.removeChild(el))
54
+ }
55
+ }
@@ -0,0 +1,80 @@
1
+ // General Fallback handler for paste
2
+ export class GeneralPasteHandler {
3
+ constructor(editor, htmlDoc, pmType) {
4
+ this.editor = editor
5
+ this.htmlDoc = htmlDoc
6
+ this.pmType = pmType
7
+ this.footnoteMarkers = []
8
+ this.footnotes = []
9
+ }
10
+
11
+ // Iterate over each node in the body of the pasted content.
12
+ getOutput() {
13
+ this.dom = this.htmlDoc.getElementsByTagName("body")[0]
14
+ this.inHTML = this.dom.innerHTML
15
+ this.iterateNode(this.dom)
16
+ this.cleanDOM()
17
+ this.convertFootnotes()
18
+ this.outHTML = this.dom.innerHTML
19
+ return this.outHTML
20
+ }
21
+
22
+ // Remove unused content
23
+ cleanDOM() {}
24
+
25
+ // Iterate over pasted nodes and their children
26
+ iterateNode(node) {
27
+ if ((node.tagName === "P") & !node.firstChild) {
28
+ node.parentNode.removeChild(node)
29
+ return
30
+ } else if (node.nodeType === 8) {
31
+ // comment node
32
+ node.parentNode.removeChild(node)
33
+ return
34
+ } else if (node.nodeType === 1) {
35
+ // element node
36
+ let childNode = node.firstChild
37
+ while (childNode) {
38
+ const nextChildNode = childNode.nextSibling
39
+ this.iterateNode(childNode)
40
+ childNode = nextChildNode
41
+ }
42
+ node = this.convertNode(node)
43
+ }
44
+ }
45
+
46
+ // Convert an existing node to a different node, if needed.
47
+ convertNode(node) {
48
+ if (
49
+ node.tagName === "TABLE" &&
50
+ node.firstElementChild?.tagName !== "CAPTION"
51
+ ) {
52
+ const caption = document.createElement("caption")
53
+ caption.innerHTML = "<span class='text'></span>"
54
+ node.insertBefore(caption, node.firstChild)
55
+ }
56
+ return node
57
+ }
58
+
59
+ // Move footnotes into their markers and turn footnote markers into the
60
+ // required format.
61
+ convertFootnotes() {
62
+ this.footnoteMarkers.forEach((fnM, index) => {
63
+ const footnote = this.footnotes[index]
64
+ const newFnM = document.createElement("span")
65
+ newFnM.classList.add("footnote-marker")
66
+ const footnoteContents = footnote.innerHTML.replace(/\s+/g, " ")
67
+ // Remove linebreaks in string (not <BR>)
68
+ // Turn multiple white spaces into single space
69
+ newFnM.dataset.footnote = footnoteContents
70
+ fnM.parentNode.replaceChild(newFnM, fnM)
71
+ })
72
+ // Remove all footnotes from document. Some footnotes may have several
73
+ // markers, so only remove each footnote once.
74
+ this.footnotes.forEach(fn => {
75
+ if (fn.parentNode) {
76
+ fn.parentNode.removeChild(fn)
77
+ }
78
+ })
79
+ }
80
+ }
@@ -0,0 +1,26 @@
1
+ import {GeneralPasteHandler} from "./general"
2
+
3
+ // Google Docs (the writing component) paste handler
4
+ export class GoogleDocsPasteHandler extends GeneralPasteHandler {
5
+ // Convert an existing node to a different node, if needed.
6
+ convertNode(node) {
7
+ node = super.convertNode(node)
8
+ // Replace nodes with other nodes to not change the number of child nodes
9
+ // <b style="font-weight:normal;">...</b> => <span>...</span>
10
+ if (node.tagName === "B" && node.style.fontWeight === "normal") {
11
+ node = this.neutralizeInlineNode(node)
12
+ }
13
+ return node
14
+ }
15
+
16
+ // Replace any type of inline node with a span node.
17
+ neutralizeInlineNode(node) {
18
+ const newNode = document.createElement("span")
19
+ while (node.firstChild) {
20
+ newNode.appendChild(node.firstChild)
21
+ }
22
+ node.parentNode.replaceChild(newNode, node)
23
+
24
+ return newNode
25
+ }
26
+ }
@@ -0,0 +1,76 @@
1
+ import {FidusWriterPasteHandler} from "./fidus_writer"
2
+ import {GeneralPasteHandler} from "./general"
3
+ import {GoogleDocsPasteHandler} from "./google_docs"
4
+ import {LibreOfficeWriterPasteHandler} from "./libreoffice_writer"
5
+ import {MicrosoftWordPasteHandler} from "./microsoft_word"
6
+
7
+ import {resetPasteRange} from "../../state_plugins/clipboard"
8
+
9
+ // Some pasted HTML will need slight conversions to work correctly.
10
+ // We try to sniff whether paste comes from MsWord, LibreOffice or Google Docs
11
+ // and use specialized handlers for these and a general handler everything else.
12
+
13
+ export class HTMLPaste {
14
+ constructor(editor, inHTML, pmType, view) {
15
+ this.editor = editor
16
+ this.inHTML = inHTML
17
+ this.pmType = pmType
18
+ this.view = view
19
+ }
20
+
21
+ getOutput() {
22
+ this.parseHTML()
23
+ this.selectHandler()
24
+ this.handlerInstance = new this.handler(
25
+ this.editor,
26
+ this.htmlDoc,
27
+ this.pmType
28
+ )
29
+ this.outHTML = this.handlerInstance.getOutput()
30
+ setTimeout(() => {
31
+ this.resetPasteRange()
32
+ }, 0)
33
+ return this.outHTML
34
+ }
35
+
36
+ parseHTML() {
37
+ const parser = new window.DOMParser()
38
+ this.htmlDoc = parser
39
+ .parseFromString(this.inHTML, "text/html")
40
+ .getElementsByTagName("html")[0]
41
+ }
42
+
43
+ // Find out what the source of the paste is and choose a corresponding
44
+ // handler.
45
+ selectHandler() {
46
+ // For LibreOffice
47
+ const head = this.htmlDoc.getElementsByTagName("head")[0]
48
+ const generatorMetaTag = head.querySelector("meta[name=generator]")
49
+ // For Google Docs
50
+ const body = this.htmlDoc.getElementsByTagName("body")[0]
51
+ const firstB = body.querySelector("b")
52
+ // For Fidus Writer
53
+ const pmSlice = this.htmlDoc.querySelector("[data-pm-slice]")
54
+ if (
55
+ this.htmlDoc.hasAttribute("xmlns:w") &&
56
+ this.htmlDoc.getAttribute("xmlns:w") ===
57
+ "urn:schemas-microsoft-com:office:word"
58
+ ) {
59
+ this.handler = MicrosoftWordPasteHandler
60
+ } else if (generatorMetaTag?.content?.startsWith("LibreOffice")) {
61
+ this.handler = LibreOfficeWriterPasteHandler
62
+ } else if (firstB?.id.startsWith("docs-internal-guid")) {
63
+ this.handler = GoogleDocsPasteHandler
64
+ } else if (pmSlice) {
65
+ this.handler = FidusWriterPasteHandler
66
+ } else {
67
+ this.handler = GeneralPasteHandler
68
+ }
69
+ }
70
+
71
+ resetPasteRange() {
72
+ const tr = this.view.state.tr
73
+ resetPasteRange(tr)
74
+ this.view.dispatch(tr)
75
+ }
76
+ }
@@ -0,0 +1,2 @@
1
+ export {HTMLPaste} from "./html"
2
+ export {TextPaste} from "./text"
@@ -0,0 +1,32 @@
1
+ import {GeneralPasteHandler} from "./general"
2
+
3
+ // LibreOffice Writer paste handler
4
+ export class LibreOfficeWriterPasteHandler extends GeneralPasteHandler {
5
+ // Convert an existing node to a different node, if needed.
6
+ convertNode(node) {
7
+ node = super.convertNode(node)
8
+ // Footnote markers (only in main pm instance):
9
+ if (
10
+ node.tagName === "A" &&
11
+ node.classList.contains("sdfootnoteanc") &&
12
+ this.pmType === "main"
13
+ ) {
14
+ // Remove "sym" at the end of the selector
15
+ const href = node.getAttribute("href")
16
+ const fnSelector =
17
+ href.length > 3 ? href.substring(0, href.length - 3) : href
18
+ const footnote = this.dom.querySelector(fnSelector)
19
+ if (footnote) {
20
+ const footnoteCounter =
21
+ footnote.querySelector("a.sdfootnotesym")
22
+ if (footnoteCounter) {
23
+ footnoteCounter.parentNode.removeChild(footnoteCounter)
24
+ }
25
+ this.footnoteMarkers.push(node)
26
+ this.footnotes.push(footnote)
27
+ }
28
+ }
29
+
30
+ return node
31
+ }
32
+ }
@@ -0,0 +1,87 @@
1
+ import {GeneralPasteHandler} from "./general"
2
+
3
+ // Microsoft Word 2016 paste handler
4
+ export class MicrosoftWordPasteHandler extends GeneralPasteHandler {
5
+ // Remove unused content
6
+ cleanDOM() {
7
+ // Remove footnote list container with separator line
8
+ const removableElements = this.dom.querySelectorAll(
9
+ 'div[style*="mso-element:footnote-list"]'
10
+ )
11
+
12
+ removableElements.forEach(el => el.parentNode.removeChild(el))
13
+ }
14
+
15
+ // Iterate over pasted nodes and their children
16
+ iterateNode(node) {
17
+ node = super.convertNode(node)
18
+ if ((node.tagName === "P") & !node.firstChild) {
19
+ node.parentNode.removeChild(node)
20
+ return true
21
+ } else if (node.nodeType === 8) {
22
+ if (node.textContent === "EndFragment") {
23
+ // End of paste content. Remove all remaining sibling nodes.
24
+ while (node) {
25
+ const nextSibling = node.nextSibling
26
+ node.parentNode.removeChild(node)
27
+ node = nextSibling
28
+ }
29
+ return false
30
+ } else {
31
+ node.parentNode.removeChild(node)
32
+ return true
33
+ }
34
+ }
35
+ if (node.nodeType === 1) {
36
+ let childNode = node.firstChild
37
+ while (childNode) {
38
+ const nextChildNode = childNode.nextSibling
39
+ if (this.iterateNode(childNode)) {
40
+ childNode = nextChildNode
41
+ } else {
42
+ childNode = false
43
+ }
44
+ }
45
+ node = this.convertNode(node)
46
+ }
47
+
48
+ return true
49
+ }
50
+
51
+ // Convert an existing node to a different node, if needed.
52
+ convertNode(node) {
53
+ // Footnote markers (only in main pm instance):
54
+ if (
55
+ node.tagName === "A" &&
56
+ node.firstChild?.tagName === "SPAN" &&
57
+ node.firstChild?.classList.contains("MsoFootnoteReference") &&
58
+ this.pmType === "main"
59
+ ) {
60
+ // Remove "#_ftn" from the selector (#_ftn1)
61
+ const fnSelector = node.getAttribute("href")
62
+ const fnNumber = node
63
+ .getAttribute("href")
64
+ .substring(5, fnSelector.length)
65
+ const footnote = this.dom.querySelector("#ftn" + fnNumber)
66
+ if (footnote) {
67
+ const footnoteCounter = footnote.querySelector(
68
+ 'a[href="#_ftnref' + fnNumber + '"]'
69
+ )
70
+ if (footnoteCounter) {
71
+ const followingNode = footnoteCounter.nextSibling
72
+ footnoteCounter.parentNode.removeChild(footnoteCounter)
73
+ if (followingNode?.nodeType === 3) {
74
+ // If there is a text string right after the footnote
75
+ // marker, remove any leading spaces.
76
+ followingNode.nodeValue =
77
+ followingNode.nodeValue.replace(/^\s+/, "")
78
+ }
79
+ }
80
+ this.footnoteMarkers.push(node)
81
+ this.footnotes.push(footnote)
82
+ }
83
+ }
84
+
85
+ return node
86
+ }
87
+ }
@@ -0,0 +1,58 @@
1
+ import {TextSelection} from "prosemirror-state"
2
+ import {__parseFromClipboard} from "prosemirror-view"
3
+
4
+ import {getPasteRange, resetPasteRange} from "../../state_plugins/clipboard"
5
+
6
+ export class TextPaste {
7
+ constructor(editor, text, view) {
8
+ this.editor = editor
9
+ this.text = text
10
+ this.view = view
11
+ this.foundBibEntries = false
12
+ }
13
+
14
+ init() {
15
+ import("../../../bibliography/import").then(
16
+ ({BibliographyImporter}) => {
17
+ const importer = new BibliographyImporter(
18
+ this.text,
19
+ this.editor.mod.db.bibDB,
20
+ newIds => {
21
+ this.foundBibEntries = true
22
+ const format = "autocite",
23
+ references = newIds.map(id => ({id}))
24
+
25
+ const citationNode = this.view.state.schema.nodes[
26
+ "citation"
27
+ ].create({format, references})
28
+ const pasteRange = getPasteRange(this.view.state)
29
+ if (pasteRange) {
30
+ const tr = this.view.state.tr
31
+ tr.replaceRangeWith(
32
+ pasteRange[0],
33
+ pasteRange[1],
34
+ citationNode
35
+ )
36
+ resetPasteRange(tr)
37
+ tr.setMeta("addToHistory", false)
38
+ this.view.dispatch(tr)
39
+ }
40
+ },
41
+ () => {
42
+ if (!this.foundBibEntries) {
43
+ // There were no citations in the pasted text.
44
+ const pasteRange = getPasteRange(this.view.state)
45
+ if (pasteRange) {
46
+ const tr = this.view.state.tr
47
+ resetPasteRange(tr)
48
+ this.view.dispatch(tr)
49
+ }
50
+ }
51
+ },
52
+ false // no messages to end user. Would be confusing if user just wants to paste unrelated text.
53
+ )
54
+ importer.init()
55
+ }
56
+ )
57
+ }
58
+ }