@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,1077 @@
1
+ import {
2
+ Dialog,
3
+ addAlert,
4
+ addProgress,
5
+ postJson,
6
+ shortFileTitle
7
+ } from "fwtoolkit"
8
+ import {CopyrightDialog} from "../../../copyright_dialog"
9
+ import {DocumentAccessRightsDialog} from "../../../documents/access_rights"
10
+ import {SaveCopy, SaveRevision} from "../../../exporter/native"
11
+ import {ExportFidusFile} from "../../../exporter/native/file"
12
+ import {LanguageDialog, RevisionDialog} from "../../dialogs"
13
+ import {E2EEKeyManager} from "../../e2ee/key-manager"
14
+ import {PassphraseManager} from "../../e2ee/passphrase-manager"
15
+ import {changePasswordDialog} from "../../e2ee/password-dialog"
16
+ import {
17
+ KeyBindingsDialog,
18
+ SearchReplaceDialog,
19
+ WordCountDialog
20
+ } from "../../tools"
21
+
22
+ const exportProgress = doc => {
23
+ const title = shortFileTitle(doc.title, doc.path || "")
24
+ const task = addProgress("info", `${title}: ${gettext("Exporting...")}`, {
25
+ autoClose: false
26
+ })
27
+ return (message, percentage) => task.update(percentage, message)
28
+ }
29
+
30
+ const languageItem = (language, name, order) => ({
31
+ title: name,
32
+ type: "setting",
33
+ order,
34
+ action: editor => {
35
+ editor.view.dispatch(
36
+ editor.view.state.tr
37
+ .setDocAttribute("language", language)
38
+ .setMeta("settings", true)
39
+ )
40
+ },
41
+ selected: editor => {
42
+ return editor.view.state.doc.attrs.language === language
43
+ },
44
+ available: editor => {
45
+ return editor.view.state.doc.attrs.languages.includes(language)
46
+ }
47
+ })
48
+
49
+ export const headerbarModel = () => ({
50
+ open: window.innerWidth > 500, // Whether the menu is shown at all.
51
+ content: [
52
+ {
53
+ id: "file",
54
+ title: gettext("File"),
55
+ tooltip: gettext("File handling"),
56
+ type: "menu",
57
+ keys: "Alt-f",
58
+ order: 0,
59
+ content: [
60
+ {
61
+ title: editor =>
62
+ editor.user.is_authenticated &&
63
+ editor.docInfo.token &&
64
+ !editor.docInfo.is_owner
65
+ ? gettext("Request Access")
66
+ : gettext("Share"),
67
+ type: "action",
68
+ //icon: 'share',
69
+ tooltip: editor =>
70
+ editor.user.is_authenticated &&
71
+ editor.docInfo.token &&
72
+ !editor.docInfo.is_owner
73
+ ? gettext("Request to be added as a collaborator.")
74
+ : gettext("Share the document with other users."),
75
+ order: 0,
76
+ action: editor => {
77
+ if (
78
+ editor.user.is_authenticated &&
79
+ editor.docInfo.token &&
80
+ !editor.docInfo.is_owner
81
+ ) {
82
+ // TokenUser requesting access
83
+ postJson("/api/document/request_access/", {
84
+ document_id: editor.docInfo.id,
85
+ rights: "write"
86
+ })
87
+ .then(({json}) => {
88
+ if (json.success) {
89
+ addAlert(
90
+ "success",
91
+ gettext(
92
+ "Your access request has been sent to the document owner."
93
+ )
94
+ )
95
+ } else {
96
+ addAlert(
97
+ "error",
98
+ json.error ||
99
+ gettext(
100
+ "Could not send access request."
101
+ )
102
+ )
103
+ }
104
+ })
105
+ .catch(() => {
106
+ addAlert(
107
+ "error",
108
+ gettext(
109
+ "Could not send access request."
110
+ )
111
+ )
112
+ })
113
+ return
114
+ }
115
+ const onShareSuccess = async newAccessRights => {
116
+ // Share the document password with newly-added user recipients.
117
+ if (
118
+ editor.e2ee?.password &&
119
+ PassphraseManager.hasKeysInSession()
120
+ ) {
121
+ const userRecipients = newAccessRights.filter(
122
+ ar =>
123
+ ar.holder?.type === "user" &&
124
+ ar.rights !== "delete"
125
+ )
126
+ const noPassphraseUsers = []
127
+ for (const ar of userRecipients) {
128
+ try {
129
+ const hasKeys =
130
+ await PassphraseManager.userHasEncryptionKeys(
131
+ ar.holder.id
132
+ )
133
+ if (hasKeys) {
134
+ // Recipient has passphrase keys —
135
+ // encrypt document password with their public key.
136
+ await PassphraseManager.saveDocumentPassword(
137
+ editor.docInfo.id,
138
+ editor.e2ee.password,
139
+ ar.holder.id,
140
+ "user",
141
+ false
142
+ )
143
+ } else {
144
+ noPassphraseUsers.push(
145
+ ar.holder?.name || "user"
146
+ )
147
+ }
148
+ } catch (_e) {
149
+ noPassphraseUsers.push(
150
+ ar.holder?.name || "user"
151
+ )
152
+ }
153
+ }
154
+
155
+ if (noPassphraseUsers.length > 0) {
156
+ const dialog = new Dialog({
157
+ title: gettext(
158
+ "Share Document Password"
159
+ ),
160
+ id: "share-password-dialog",
161
+ width: 500,
162
+ body: `<p>${gettext(
163
+ "The following users don't have passphrase encryption. Please share the document password with them directly."
164
+ )}</p><ul>${noPassphraseUsers
165
+ .map(
166
+ name =>
167
+ `<li><strong>${name}</strong>: <code>${editor.e2ee.password}</code></li>`
168
+ )
169
+ .join("")}</ul>`,
170
+ buttons: [
171
+ {
172
+ text: gettext("Close"),
173
+ classes: "fw-dark",
174
+ click: () => dialog.close()
175
+ }
176
+ ]
177
+ })
178
+ dialog.open()
179
+ }
180
+ }
181
+ }
182
+ const dialog = new DocumentAccessRightsDialog(
183
+ [editor.docInfo.id],
184
+ editor.docInfo.owner.contacts,
185
+ contactData => {
186
+ editor.docInfo.owner.contacts.push(contactData)
187
+ },
188
+ editor.e2ee?.encrypted,
189
+ editor.e2ee?.password || "",
190
+ onShareSuccess,
191
+ editor.app.settings
192
+ )
193
+ dialog.init()
194
+ },
195
+ disabled: editor => {
196
+ return (
197
+ editor.app.isOffline() ||
198
+ !editor.user.is_authenticated
199
+ )
200
+ }
201
+ },
202
+ {
203
+ title: editor =>
204
+ editor.user.is_authenticated
205
+ ? gettext("Close")
206
+ : gettext("Sign up / Log in"),
207
+ type: "action",
208
+ //icon: 'times-circle',
209
+ tooltip: editor =>
210
+ editor.user.is_authenticated
211
+ ? gettext(
212
+ "Close the document and return to the document overview menu."
213
+ )
214
+ : gettext("Sign up for an account or log in."),
215
+ order: 1,
216
+ action: editor => {
217
+ if (editor.user.is_authenticated) {
218
+ const folderPath = editor.docInfo.path.slice(
219
+ 0,
220
+ editor.docInfo.path.lastIndexOf("/")
221
+ )
222
+ if (
223
+ !folderPath.length &&
224
+ editor.app.routes[""].app === "document"
225
+ ) {
226
+ editor.app.goTo("/")
227
+ } else {
228
+ editor.app.goTo(`/documents${folderPath}/`)
229
+ }
230
+ } else {
231
+ if (
232
+ editor.app.settings?.REGISTRATION_OPEN ||
233
+ editor.app.settings?.SOCIALACCOUNT_OPEN
234
+ ) {
235
+ window.location.href = "/account/sign-up/"
236
+ } else {
237
+ window.location.href = "/"
238
+ }
239
+ }
240
+ return
241
+ },
242
+ disabled: editor => editor.app.isOffline()
243
+ },
244
+ {
245
+ title: gettext("Save revision"),
246
+ type: "action",
247
+ //icon: 'save',
248
+ tooltip: gettext("Save a revision of the document."),
249
+ order: 2,
250
+ keys: "Ctrl-s",
251
+ action: editor => {
252
+ const dialog = new RevisionDialog(editor.docInfo.dir)
253
+ dialog.init().then(note => {
254
+ const saver = new SaveRevision(
255
+ editor.getDoc(),
256
+ editor.mod.db.imageDB,
257
+ editor.mod.db.bibDB,
258
+ note,
259
+ editor.app
260
+ )
261
+ return saver.init()
262
+ })
263
+ },
264
+ disabled: editor =>
265
+ editor.docInfo.access_rights !== "write" ||
266
+ editor.app.isOffline() ||
267
+ !!editor.docInfo.token
268
+ },
269
+ {
270
+ title: gettext("Create copy"),
271
+ type: "action",
272
+ //icon: 'copy',
273
+ tooltip: gettext("Create a copy of the document."),
274
+ order: 3,
275
+ action: editor => {
276
+ const copier = new SaveCopy(
277
+ editor.getDoc(),
278
+ editor.mod.db.bibDB,
279
+ editor.mod.db.imageDB,
280
+ editor.user
281
+ )
282
+ copier
283
+ .init()
284
+ .then(({docInfo}) =>
285
+ editor.app.goTo(`/document/${docInfo.id}/`)
286
+ )
287
+ .catch(() => false)
288
+ },
289
+ disabled: editor =>
290
+ editor.app.isOffline() ||
291
+ (!!editor.docInfo.token &&
292
+ !editor.user.is_authenticated)
293
+ },
294
+ {
295
+ title: gettext("Download"),
296
+ type: "action",
297
+ //icon: 'download',
298
+ tooltip: gettext(
299
+ "Export the document as a FIDUS file including its template."
300
+ ),
301
+ order: 4,
302
+ action: editor => {
303
+ new ExportFidusFile(
304
+ editor.getDoc(),
305
+ editor.mod.db.bibDB,
306
+ editor.mod.db.imageDB,
307
+ true,
308
+ editor.docInfo.token
309
+ )
310
+ },
311
+ disabled: editor => editor.app.isOffline()
312
+ },
313
+ {
314
+ title: gettext("Print/PDF"),
315
+ type: "action",
316
+ //icon: 'print',
317
+ tooltip: gettext(
318
+ "Either print or create a PDF using your browser print dialog."
319
+ ),
320
+ order: 5,
321
+ keys: "Ctrl-p",
322
+ action: editor => {
323
+ import(
324
+ "@fiduswriter/document/exporter/print/index"
325
+ ).then(({PrintExporter}) => {
326
+ const doc = editor.getDoc({
327
+ changes: "acceptAllNoInsertions"
328
+ })
329
+ const title = shortFileTitle(
330
+ doc.title,
331
+ doc.path || ""
332
+ )
333
+ const task = addProgress(
334
+ "info",
335
+ `${title}: ${gettext("Preparing print view...")}`,
336
+ {autoClose: false}
337
+ )
338
+ const exporter = new PrintExporter(
339
+ doc,
340
+ editor.mod.db.bibDB,
341
+ editor.mod.db.imageDB,
342
+ editor.app.csl,
343
+ editor.docInfo.updated,
344
+ editor.mod.documentTemplate.documentStyles,
345
+ (message, percentage) =>
346
+ task.update(percentage, message)
347
+ )
348
+ exporter.init()
349
+ })
350
+ }
351
+ },
352
+ {
353
+ title: gettext("Change password"),
354
+ type: "action",
355
+ tooltip: gettext(
356
+ "Change the password of this encrypted document."
357
+ ),
358
+ order: 6,
359
+ available: editor => editor.docInfo.e2ee,
360
+ action: async editor => {
361
+ if (!editor.e2ee?.key) {
362
+ addAlert(
363
+ "error",
364
+ gettext(
365
+ "Document key is not available. Please reload the document."
366
+ )
367
+ )
368
+ return
369
+ }
370
+ const isPassphraseUser =
371
+ editor.e2ee?.usesPassphrase &&
372
+ PassphraseManager.hasKeysInSession()
373
+ const suggestedNewPassword = isPassphraseUser
374
+ ? await PassphraseManager.generateDocumentPassword()
375
+ : ""
376
+
377
+ let changeOptions
378
+ if (isPassphraseUser) {
379
+ // Passphrase users: current password is known, new password
380
+ // is auto-generated and shown in plaintext for sharing.
381
+ changeOptions = {
382
+ currentPassword:
383
+ editor.e2ee.password ||
384
+ E2EEKeyManager.getPasswordFromSession(
385
+ editor.docInfo.id
386
+ ) ||
387
+ "",
388
+ suggestedNewPassword,
389
+ hideCurrentPassword: true,
390
+ showNewPasswordPlaintext: true,
391
+ infoText: gettext(
392
+ "Your personal passphrase will still unlock this document. A new random password is generated automatically. Other passphrase users will receive it automatically; non-passphrase collaborators need it shared with them manually."
393
+ )
394
+ }
395
+ } else {
396
+ // Non-passphrase users: prefill current password from
397
+ // sessionStorage if available, but keep it visible for
398
+ // verification.
399
+ const sessionPassword =
400
+ E2EEKeyManager.getPasswordFromSession(
401
+ editor.docInfo.id
402
+ )
403
+ changeOptions = {
404
+ currentPassword: sessionPassword || "",
405
+ suggestedNewPassword: ""
406
+ }
407
+ }
408
+
409
+ changePasswordDialog(
410
+ async ({currentPassword, newPassword}) => {
411
+ try {
412
+ // Verify the current password.
413
+ // If the entered password matches what is already cached
414
+ // in memory or sessionStorage, the document is already
415
+ // open with that key — skip the expensive PBKDF2
416
+ // re-derivation used only to prove correctness.
417
+ const cachedPassword =
418
+ editor.e2ee.password ||
419
+ E2EEKeyManager.getPasswordFromSession(
420
+ editor.docInfo.id
421
+ )
422
+ if (
423
+ !cachedPassword ||
424
+ currentPassword !== cachedPassword
425
+ ) {
426
+ const currentSaltBytes = new Uint8Array(
427
+ atob(editor.e2ee.encryptionSalt)
428
+ .split("")
429
+ .map(c => c.charCodeAt(0))
430
+ )
431
+ const currentKey =
432
+ await E2EEKeyManager.resolvePasswordToKey(
433
+ currentPassword,
434
+ currentSaltBytes,
435
+ editor.e2ee.encryptionIterations
436
+ )
437
+ const {E2EEEncryptor} = await import(
438
+ "../../e2ee/encryptor"
439
+ )
440
+ const testValue = "test"
441
+ const encryptedTest =
442
+ await E2EEEncryptor.encrypt(
443
+ testValue,
444
+ currentKey
445
+ )
446
+ await E2EEEncryptor.decrypt(
447
+ encryptedTest,
448
+ editor.e2ee.key
449
+ )
450
+ }
451
+
452
+ // Current password verified — generate new salt and key
453
+ const newSalt =
454
+ E2EEKeyManager.generateSalt()
455
+ const newSaltBase64 = btoa(
456
+ String.fromCharCode(...newSalt)
457
+ )
458
+ const newIterations = 600000
459
+ const newKey =
460
+ await E2EEKeyManager.resolvePasswordToKey(
461
+ newPassword,
462
+ newSalt,
463
+ newIterations
464
+ )
465
+
466
+ // Re-encrypt the document with the new key
467
+ await editor.e2ee.snapshotManager.reEncryptWithNewKey(
468
+ newKey,
469
+ newSaltBase64,
470
+ newIterations
471
+ )
472
+
473
+ // Update local E2EE state
474
+ editor.e2ee.encryptionSalt = newSaltBase64
475
+ editor.e2ee.encryptionIterations =
476
+ newIterations
477
+ editor.e2ee.key = newKey
478
+ editor.e2ee.password = newPassword
479
+
480
+ // Cache password and key in sessionStorage
481
+ E2EEKeyManager.storePasswordInSession(
482
+ editor.docInfo.id,
483
+ newPassword
484
+ )
485
+ await E2EEKeyManager.storeKeyInSession(
486
+ editor.docInfo.id,
487
+ newKey
488
+ )
489
+
490
+ // If passphrase user, update encrypted password on server
491
+ if (isPassphraseUser) {
492
+ try {
493
+ await PassphraseManager.saveDocumentPassword(
494
+ editor.docInfo.id,
495
+ newPassword,
496
+ null,
497
+ "user",
498
+ true
499
+ )
500
+ } catch (_e) {
501
+ console.error(
502
+ "Failed to update document password on server:",
503
+ _e
504
+ )
505
+ }
506
+ }
507
+
508
+ if (isPassphraseUser) {
509
+ addAlert(
510
+ "success",
511
+ gettext(
512
+ "Document encryption key rotated. Other passphrase users will receive the new key automatically."
513
+ )
514
+ )
515
+ } else {
516
+ addAlert(
517
+ "success",
518
+ gettext(
519
+ "Document password changed. Remember to share the new password with your collaborators."
520
+ )
521
+ )
522
+ }
523
+ } catch (_error) {
524
+ addAlert(
525
+ "error",
526
+ gettext(
527
+ "The current password is incorrect."
528
+ )
529
+ )
530
+ }
531
+ },
532
+ changeOptions
533
+ )
534
+ },
535
+ disabled: editor =>
536
+ !editor.e2ee?.encrypted ||
537
+ editor.docInfo.access_rights !== "write"
538
+ }
539
+ ]
540
+ },
541
+ {
542
+ id: "export",
543
+ title: gettext("Export"),
544
+ tooltip: gettext("Export of the document contents"),
545
+ type: "menu",
546
+ order: 1,
547
+ keys: "Alt-e",
548
+ content: [
549
+ {
550
+ title: gettext("HTML"),
551
+ type: "action",
552
+ tooltip: gettext("Export the document to an HTML file."),
553
+ order: 0,
554
+ action: editor => {
555
+ import(
556
+ "@fiduswriter/document/exporter/html/index"
557
+ ).then(({HTMLExporter}) => {
558
+ const doc = editor.getDoc({
559
+ changes: "acceptAllNoInsertions"
560
+ })
561
+ const exporter = new HTMLExporter(
562
+ doc,
563
+ editor.mod.db.bibDB,
564
+ editor.mod.db.imageDB,
565
+ editor.app.csl,
566
+ editor.docInfo.updated,
567
+ editor.mod.documentTemplate.documentStyles
568
+ )
569
+ exporter.progressCallback = exportProgress(doc)
570
+ exporter.init()
571
+ })
572
+ }
573
+ },
574
+ {
575
+ title: gettext("Epub"),
576
+ type: "action",
577
+ tooltip: gettext(
578
+ "Export the document to an Epub electronic reader file."
579
+ ),
580
+ order: 1,
581
+ action: editor => {
582
+ import(
583
+ "@fiduswriter/document/exporter/epub/index"
584
+ ).then(({EpubExporter}) => {
585
+ const doc = editor.getDoc({
586
+ changes: "acceptAllNoInsertions"
587
+ })
588
+ const exporter = new EpubExporter(
589
+ doc,
590
+ editor.mod.db.bibDB,
591
+ editor.mod.db.imageDB,
592
+ editor.app.csl,
593
+ editor.docInfo.updated,
594
+ editor.mod.documentTemplate.documentStyles
595
+ )
596
+ exporter.progressCallback = exportProgress(doc)
597
+ exporter.init()
598
+ })
599
+ },
600
+ disabled: editor => editor.app.isOffline()
601
+ },
602
+ {
603
+ title: gettext("LaTeX"),
604
+ type: "action",
605
+ tooltip: gettext("Export the document to an LaTeX file."),
606
+ order: 2,
607
+ action: editor => {
608
+ import(
609
+ "@fiduswriter/document/exporter/latex/index"
610
+ ).then(({LatexExporter}) => {
611
+ const doc = editor.getDoc({
612
+ changes: "acceptAllNoInsertions"
613
+ })
614
+ const exporter = new LatexExporter(
615
+ doc,
616
+ editor.mod.db.bibDB,
617
+ editor.mod.db.imageDB,
618
+ editor.docInfo.updated
619
+ )
620
+ exporter.progressCallback = exportProgress(doc)
621
+ exporter.init()
622
+ })
623
+ },
624
+ disabled: editor => editor.app.isOffline()
625
+ },
626
+ {
627
+ title: gettext("JATS"),
628
+ type: "action",
629
+ tooltip: gettext(
630
+ "Export the document to a Journal Archiving and Interchange Tag Library NISO JATS Version 1.2 file."
631
+ ),
632
+ order: 2,
633
+ action: editor => {
634
+ import(
635
+ "@fiduswriter/document/exporter/jats/index"
636
+ ).then(({JATSExporter}) => {
637
+ const doc = editor.getDoc({
638
+ changes: "acceptAllNoInsertions"
639
+ })
640
+ const exporter = new JATSExporter(
641
+ doc,
642
+ editor.mod.db.bibDB,
643
+ editor.mod.db.imageDB,
644
+ editor.app.csl,
645
+ editor.docInfo.updated,
646
+ "article"
647
+ )
648
+ exporter.progressCallback = exportProgress(doc)
649
+ exporter.init()
650
+ })
651
+ },
652
+ disabled: editor => editor.app.isOffline()
653
+ },
654
+ {
655
+ title: gettext("BITS"),
656
+ type: "action",
657
+ tooltip: gettext(
658
+ "Export the document to a Book Interchange Tag Set BITS Version 2.1 file."
659
+ ),
660
+ order: 2,
661
+ action: editor => {
662
+ import(
663
+ "@fiduswriter/document/exporter/jats/index"
664
+ ).then(({JATSExporter}) => {
665
+ const doc = editor.getDoc({
666
+ changes: "acceptAllNoInsertions"
667
+ })
668
+ const exporter = new JATSExporter(
669
+ doc,
670
+ editor.mod.db.bibDB,
671
+ editor.mod.db.imageDB,
672
+ editor.app.csl,
673
+ editor.docInfo.updated,
674
+ "book-part-wrapper"
675
+ )
676
+ exporter.progressCallback = exportProgress(doc)
677
+ exporter.init()
678
+ })
679
+ },
680
+ disabled: editor => editor.app.isOffline()
681
+ },
682
+ {
683
+ title: gettext("Pandoc JSON"),
684
+ type: "action",
685
+ tooltip: gettext(
686
+ "Export the document to a Pandoc JSON file."
687
+ ),
688
+ order: 3,
689
+ action: editor => {
690
+ import(
691
+ "@fiduswriter/document/exporter/pandoc/index"
692
+ ).then(({PandocExporter}) => {
693
+ const doc = editor.getDoc({
694
+ changes: "acceptAllNoInsertions"
695
+ })
696
+ const exporter = new PandocExporter(
697
+ doc,
698
+ editor.mod.db.bibDB,
699
+ editor.mod.db.imageDB,
700
+ editor.app.csl,
701
+ editor.docInfo.updated
702
+ )
703
+ exporter.progressCallback = exportProgress(doc)
704
+ exporter.init()
705
+ })
706
+ },
707
+ disabled: editor => editor.app.isOffline()
708
+ },
709
+ {
710
+ title: gettext("Slim FIDUS"),
711
+ type: "action",
712
+ tooltip: gettext(
713
+ "Export the document to a FIDUS file without its template."
714
+ ),
715
+ order: 4,
716
+ action: editor => {
717
+ new ExportFidusFile(
718
+ editor.getDoc(),
719
+ editor.mod.db.bibDB,
720
+ editor.mod.db.imageDB,
721
+ false
722
+ )
723
+ }
724
+ }
725
+ ]
726
+ },
727
+ {
728
+ id: "settings",
729
+ title: gettext("Settings"),
730
+ tooltip: gettext("Configure settings of this document."),
731
+ type: "menu",
732
+ order: 2,
733
+ keys: "Alt-s",
734
+ content: [
735
+ {
736
+ id: "citation_style",
737
+ title: gettext("Citation Style"),
738
+ type: "menu",
739
+ tooltip: gettext("Choose your preferred citation style."),
740
+ order: 1,
741
+ disabled: editor => {
742
+ return editor.docInfo.access_rights !== "write"
743
+ },
744
+ content: []
745
+ },
746
+ {
747
+ id: "document_style",
748
+ title: gettext("Document Style"),
749
+ type: "menu",
750
+ tooltip: gettext("Choose your preferred document style."),
751
+ order: 2,
752
+ disabled: editor => {
753
+ return (
754
+ editor.docInfo.access_rights !== "write" ||
755
+ editor.app.isOffline()
756
+ )
757
+ },
758
+ content: []
759
+ },
760
+ {
761
+ id: "language",
762
+ title: gettext("Text Language"),
763
+ type: "menu",
764
+ tooltip: gettext("Choose the language of the document."),
765
+ order: 3,
766
+ disabled: editor => {
767
+ return editor.docInfo.access_rights !== "write"
768
+ },
769
+ content: [
770
+ languageItem(
771
+ "en-US",
772
+ gettext("English (United States)"),
773
+ 0
774
+ ),
775
+ languageItem(
776
+ "en-GB",
777
+ gettext("English (United Kingdom)"),
778
+ 1
779
+ ),
780
+ languageItem("de-DE", gettext("German (Germany)"), 2),
781
+ languageItem(
782
+ "zh-CN",
783
+ gettext("Chinese (Simplified)"),
784
+ 3
785
+ ),
786
+ languageItem("es", gettext("Spanish"), 4),
787
+ languageItem("fr", gettext("French"), 5),
788
+ languageItem("ja", gettext("Japanese"), 6),
789
+ languageItem("it", gettext("Italian"), 7),
790
+ //languageItem('pl', gettext('Polish'), 8),
791
+ languageItem(
792
+ "pt-BR",
793
+ gettext("Portuguese (Brazil)"),
794
+ 9
795
+ ),
796
+ //languageItem('nl', gettext('Dutch'), 10),
797
+ //languageItem('ru', gettext('Russian'), 11),
798
+ {
799
+ type: "separator",
800
+ order: 12,
801
+ available: editor => {
802
+ // There has to be at least one language of the default languages
803
+ // among the default ones and one that is not among the default ones.
804
+ return (
805
+ !!editor.view.state.doc.attrs.languages.find(
806
+ lang =>
807
+ [
808
+ "en-US",
809
+ "en-GB",
810
+ "de-DE",
811
+ "zh-CN",
812
+ "es",
813
+ "fr",
814
+ "ja",
815
+ "it",
816
+ "pl",
817
+ "pt-BR",
818
+ "nl",
819
+ "ru"
820
+ ].includes(lang)
821
+ ) &&
822
+ !!editor.view.state.doc.attrs.languages.find(
823
+ lang =>
824
+ ![
825
+ "en-US",
826
+ "en-GB",
827
+ "de-DE",
828
+ "zh-CN",
829
+ "es",
830
+ "fr",
831
+ "ja",
832
+ "it",
833
+ "pl",
834
+ "pt-BR",
835
+ "nl",
836
+ "ru"
837
+ ].includes(lang)
838
+ )
839
+ )
840
+ }
841
+ },
842
+ {
843
+ title: gettext("Other"),
844
+ type: "setting",
845
+ order: 13,
846
+ action: editor => {
847
+ const language =
848
+ editor.view.state.doc.attrs.language,
849
+ dialog = new LanguageDialog(
850
+ editor,
851
+ language
852
+ )
853
+ dialog.init()
854
+ },
855
+ selected: editor => {
856
+ return ![
857
+ "en-US",
858
+ "en-GB",
859
+ "de-DE",
860
+ "zh-CN",
861
+ "es",
862
+ "fr",
863
+ "ja",
864
+ "it",
865
+ "pl",
866
+ "pt-BR",
867
+ "nl",
868
+ "ru"
869
+ ].includes(editor.view.state.doc.attrs.language)
870
+ },
871
+ available: editor =>
872
+ !!editor.view.state.doc.attrs.languages.find(
873
+ lang =>
874
+ ![
875
+ "en-US",
876
+ "en-GB",
877
+ "de-DE",
878
+ "zh-CN",
879
+ "es",
880
+ "fr",
881
+ "ja",
882
+ "it",
883
+ "pl",
884
+ "pt-BR",
885
+ "nl",
886
+ "ru"
887
+ ].includes(lang)
888
+ )
889
+ }
890
+ ]
891
+ },
892
+ {
893
+ id: "paper_size",
894
+ title: gettext("Paper Size"),
895
+ type: "menu",
896
+ tooltip: gettext(
897
+ "Choose a papersize for print and PDF generation."
898
+ ),
899
+ order: 4,
900
+ disabled: editor => {
901
+ return editor.docInfo.access_rights !== "write"
902
+ },
903
+ content: [
904
+ {
905
+ title: gettext("DIN A4"),
906
+ type: "setting",
907
+ tooltip: gettext(
908
+ "A4 (DIN A4/ISO 216) which is used in most of the world."
909
+ ),
910
+ order: 0,
911
+ action: editor => {
912
+ editor.view.dispatch(
913
+ editor.view.state.tr
914
+ .setDocAttribute("papersize", "A4")
915
+ .setMeta("settings", true)
916
+ )
917
+ },
918
+ selected: editor => {
919
+ return (
920
+ editor.view.state.doc.attrs.papersize ===
921
+ "A4"
922
+ )
923
+ },
924
+ available: editor => {
925
+ return editor.view.state.doc.attrs.papersizes.includes(
926
+ "A4"
927
+ )
928
+ }
929
+ },
930
+ {
931
+ title: gettext("US Letter"),
932
+ type: "setting",
933
+ tooltip: gettext(
934
+ "The format used by the USA and some other American countries."
935
+ ),
936
+ order: 1,
937
+ action: editor => {
938
+ editor.view.dispatch(
939
+ editor.view.state.tr
940
+ .setDocAttribute(
941
+ "papersize",
942
+ "US Letter"
943
+ )
944
+ .setMeta("settings", true)
945
+ )
946
+ },
947
+ selected: editor => {
948
+ return (
949
+ editor.view.state.doc.attrs.papersize ===
950
+ "US Letter"
951
+ )
952
+ },
953
+ available: editor => {
954
+ return editor.view.state.doc.attrs.papersizes.includes(
955
+ "US Letter"
956
+ )
957
+ }
958
+ }
959
+ ]
960
+ },
961
+ {
962
+ title: gettext("Copyright Information"),
963
+ type: "setting",
964
+ order: 5,
965
+ action: editor => {
966
+ const dialog = new CopyrightDialog(
967
+ editor.view.state.doc.attrs.copyright
968
+ )
969
+ dialog.init().then(copyright => {
970
+ if (copyright) {
971
+ editor.view.dispatch(
972
+ editor.view.state.tr
973
+ .setDocAttribute("copyright", copyright)
974
+ .setMeta("settings", true)
975
+ )
976
+ }
977
+ editor.currentView.focus()
978
+ })
979
+ },
980
+ disabled: editor => editor.docInfo.access_rights !== "write"
981
+ }
982
+ ]
983
+ },
984
+ {
985
+ id: "tools",
986
+ title: gettext("Tools"),
987
+ tooltip: gettext("Select document editing tool."),
988
+ type: "menu",
989
+ order: 3,
990
+ keys: "Alt-t",
991
+ content: [
992
+ {
993
+ title: gettext("Word counter"),
994
+ type: "action",
995
+ tooltip: gettext("See document statistics."),
996
+ order: 0,
997
+ action: editor => {
998
+ const dialog = new WordCountDialog(editor)
999
+ dialog.init()
1000
+ }
1001
+ },
1002
+ {
1003
+ title: gettext("Search and replace"),
1004
+ type: "action",
1005
+ tooltip: gettext("Show a search and replace dialog."),
1006
+ order: 1,
1007
+ keys: "Ctrl-h",
1008
+ action: editor => {
1009
+ const dialog = new SearchReplaceDialog(editor)
1010
+ dialog.init()
1011
+ }
1012
+ },
1013
+ {
1014
+ title: gettext("Keyboard shortcuts"),
1015
+ type: "action",
1016
+ tooltip: gettext(
1017
+ "Show an overview of available keyboard shortcuts."
1018
+ ),
1019
+ order: 2,
1020
+ keys: "Shift-Ctrl-/",
1021
+ action: editor => {
1022
+ const dialog = new KeyBindingsDialog(editor)
1023
+ dialog.init()
1024
+ }
1025
+ }
1026
+ ]
1027
+ },
1028
+ {
1029
+ title: gettext("Track changes"),
1030
+ type: "menu",
1031
+ tooltip: gettext("Tracking changes to the document"),
1032
+ order: 4,
1033
+ keys: "Alt-c",
1034
+ disabled: editor => editor.docInfo.access_rights !== "write",
1035
+ content: [
1036
+ {
1037
+ title: gettext("Record"),
1038
+ type: "setting",
1039
+ tooltip: gettext("Record document changes"),
1040
+ order: 0,
1041
+ disabled: editor => {
1042
+ return editor.docInfo.access_rights !== "write"
1043
+ },
1044
+ action: editor => {
1045
+ const tracked = !editor.view.state.doc.attrs.tracked
1046
+ editor.view.dispatch(
1047
+ editor.view.state.tr
1048
+ .setDocAttribute("tracked", tracked)
1049
+ .setMeta("settings", true)
1050
+ )
1051
+ },
1052
+ selected: editor => {
1053
+ return editor.view.state.doc.attrs.tracked === true
1054
+ }
1055
+ },
1056
+ {
1057
+ title: gettext("Accept all"),
1058
+ type: "action",
1059
+ tooltip: gettext("Accept all tracked changes."),
1060
+ order: 1,
1061
+ action: editor => {
1062
+ editor.mod.track.acceptAll()
1063
+ }
1064
+ },
1065
+ {
1066
+ title: gettext("Reject all"),
1067
+ type: "action",
1068
+ tooltip: gettext("Reject all tracked changes."),
1069
+ order: 2,
1070
+ action: editor => {
1071
+ editor.mod.track.rejectAll()
1072
+ }
1073
+ }
1074
+ ]
1075
+ }
1076
+ ]
1077
+ })