@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,743 @@
1
+ import { Dialog, addAlert, addProgress, postJson, shortFileTitle } from "fwtoolkit";
2
+ import { CopyrightDialog } from "../../../copyright_dialog";
3
+ import { DocumentAccessRightsDialog } from "../../../documents/access_rights";
4
+ import { SaveCopy, SaveRevision } from "../../../exporter/native";
5
+ import { ExportFidusFile } from "../../../exporter/native/file";
6
+ import { LanguageDialog, RevisionDialog } from "../../dialogs";
7
+ import { E2EEKeyManager } from "../../e2ee/key-manager";
8
+ import { PassphraseManager } from "../../e2ee/passphrase-manager";
9
+ import { changePasswordDialog } from "../../e2ee/password-dialog";
10
+ import { KeyBindingsDialog, SearchReplaceDialog, WordCountDialog } from "../../tools";
11
+ const exportProgress = doc => {
12
+ const title = shortFileTitle(doc.title, doc.path || "");
13
+ const task = addProgress("info", `${title}: ${gettext("Exporting...")}`, {
14
+ autoClose: false
15
+ });
16
+ return (message, percentage) => task.update(percentage, message);
17
+ };
18
+ const languageItem = (language, name, order) => ({
19
+ title: name,
20
+ type: "setting",
21
+ order,
22
+ action: editor => {
23
+ editor.view.dispatch(editor.view.state.tr
24
+ .setDocAttribute("language", language)
25
+ .setMeta("settings", true));
26
+ },
27
+ selected: editor => {
28
+ return editor.view.state.doc.attrs.language === language;
29
+ },
30
+ available: editor => {
31
+ return editor.view.state.doc.attrs.languages.includes(language);
32
+ }
33
+ });
34
+ export const headerbarModel = () => ({
35
+ open: window.innerWidth > 500, // Whether the menu is shown at all.
36
+ content: [
37
+ {
38
+ id: "file",
39
+ title: gettext("File"),
40
+ tooltip: gettext("File handling"),
41
+ type: "menu",
42
+ keys: "Alt-f",
43
+ order: 0,
44
+ content: [
45
+ {
46
+ title: editor => editor.user.is_authenticated &&
47
+ editor.docInfo.token &&
48
+ !editor.docInfo.is_owner
49
+ ? gettext("Request Access")
50
+ : gettext("Share"),
51
+ type: "action",
52
+ //icon: 'share',
53
+ tooltip: editor => editor.user.is_authenticated &&
54
+ editor.docInfo.token &&
55
+ !editor.docInfo.is_owner
56
+ ? gettext("Request to be added as a collaborator.")
57
+ : gettext("Share the document with other users."),
58
+ order: 0,
59
+ action: editor => {
60
+ if (editor.user.is_authenticated &&
61
+ editor.docInfo.token &&
62
+ !editor.docInfo.is_owner) {
63
+ // TokenUser requesting access
64
+ postJson("/api/document/request_access/", {
65
+ document_id: editor.docInfo.id,
66
+ rights: "write"
67
+ })
68
+ .then(({ json }) => {
69
+ if (json.success) {
70
+ addAlert("success", gettext("Your access request has been sent to the document owner."));
71
+ }
72
+ else {
73
+ addAlert("error", json.error ||
74
+ gettext("Could not send access request."));
75
+ }
76
+ })
77
+ .catch(() => {
78
+ addAlert("error", gettext("Could not send access request."));
79
+ });
80
+ return;
81
+ }
82
+ const onShareSuccess = async (newAccessRights) => {
83
+ // Share the document password with newly-added user recipients.
84
+ if (editor.e2ee?.password &&
85
+ PassphraseManager.hasKeysInSession()) {
86
+ const userRecipients = newAccessRights.filter(ar => ar.holder?.type === "user" &&
87
+ ar.rights !== "delete");
88
+ const noPassphraseUsers = [];
89
+ for (const ar of userRecipients) {
90
+ try {
91
+ const hasKeys = await PassphraseManager.userHasEncryptionKeys(ar.holder.id);
92
+ if (hasKeys) {
93
+ // Recipient has passphrase keys —
94
+ // encrypt document password with their public key.
95
+ await PassphraseManager.saveDocumentPassword(editor.docInfo.id, editor.e2ee.password, ar.holder.id, "user", false);
96
+ }
97
+ else {
98
+ noPassphraseUsers.push(ar.holder?.name || "user");
99
+ }
100
+ }
101
+ catch (_e) {
102
+ noPassphraseUsers.push(ar.holder?.name || "user");
103
+ }
104
+ }
105
+ if (noPassphraseUsers.length > 0) {
106
+ const dialog = new Dialog({
107
+ title: gettext("Share Document Password"),
108
+ id: "share-password-dialog",
109
+ width: 500,
110
+ body: `<p>${gettext("The following users don't have passphrase encryption. Please share the document password with them directly.")}</p><ul>${noPassphraseUsers
111
+ .map(name => `<li><strong>${name}</strong>: <code>${editor.e2ee.password}</code></li>`)
112
+ .join("")}</ul>`,
113
+ buttons: [
114
+ {
115
+ text: gettext("Close"),
116
+ classes: "fw-dark",
117
+ click: () => dialog.close()
118
+ }
119
+ ]
120
+ });
121
+ dialog.open();
122
+ }
123
+ }
124
+ };
125
+ const dialog = new DocumentAccessRightsDialog([editor.docInfo.id], editor.docInfo.owner.contacts, contactData => {
126
+ editor.docInfo.owner.contacts.push(contactData);
127
+ }, editor.e2ee?.encrypted, editor.e2ee?.password || "", onShareSuccess, editor.app.settings);
128
+ dialog.init();
129
+ },
130
+ disabled: editor => {
131
+ return (editor.app.isOffline() ||
132
+ !editor.user.is_authenticated);
133
+ }
134
+ },
135
+ {
136
+ title: editor => editor.user.is_authenticated
137
+ ? gettext("Close")
138
+ : gettext("Sign up / Log in"),
139
+ type: "action",
140
+ //icon: 'times-circle',
141
+ tooltip: editor => editor.user.is_authenticated
142
+ ? gettext("Close the document and return to the document overview menu.")
143
+ : gettext("Sign up for an account or log in."),
144
+ order: 1,
145
+ action: editor => {
146
+ if (editor.user.is_authenticated) {
147
+ const folderPath = editor.docInfo.path.slice(0, editor.docInfo.path.lastIndexOf("/"));
148
+ if (!folderPath.length &&
149
+ editor.app.routes[""].app === "document") {
150
+ editor.app.goTo("/");
151
+ }
152
+ else {
153
+ editor.app.goTo(`/documents${folderPath}/`);
154
+ }
155
+ }
156
+ else {
157
+ if (editor.app.settings?.REGISTRATION_OPEN ||
158
+ editor.app.settings?.SOCIALACCOUNT_OPEN) {
159
+ window.location.href = "/account/sign-up/";
160
+ }
161
+ else {
162
+ window.location.href = "/";
163
+ }
164
+ }
165
+ return;
166
+ },
167
+ disabled: editor => editor.app.isOffline()
168
+ },
169
+ {
170
+ title: gettext("Save revision"),
171
+ type: "action",
172
+ //icon: 'save',
173
+ tooltip: gettext("Save a revision of the document."),
174
+ order: 2,
175
+ keys: "Ctrl-s",
176
+ action: editor => {
177
+ const dialog = new RevisionDialog(editor.docInfo.dir);
178
+ dialog.init().then(note => {
179
+ const saver = new SaveRevision(editor.getDoc(), editor.mod.db.imageDB, editor.mod.db.bibDB, note, editor.app);
180
+ return saver.init();
181
+ });
182
+ },
183
+ disabled: editor => editor.docInfo.access_rights !== "write" ||
184
+ editor.app.isOffline() ||
185
+ !!editor.docInfo.token
186
+ },
187
+ {
188
+ title: gettext("Create copy"),
189
+ type: "action",
190
+ //icon: 'copy',
191
+ tooltip: gettext("Create a copy of the document."),
192
+ order: 3,
193
+ action: editor => {
194
+ const copier = new SaveCopy(editor.getDoc(), editor.mod.db.bibDB, editor.mod.db.imageDB, editor.user);
195
+ copier
196
+ .init()
197
+ .then(({ docInfo }) => editor.app.goTo(`/document/${docInfo.id}/`))
198
+ .catch(() => false);
199
+ },
200
+ disabled: editor => editor.app.isOffline() ||
201
+ (!!editor.docInfo.token &&
202
+ !editor.user.is_authenticated)
203
+ },
204
+ {
205
+ title: gettext("Download"),
206
+ type: "action",
207
+ //icon: 'download',
208
+ tooltip: gettext("Export the document as a FIDUS file including its template."),
209
+ order: 4,
210
+ action: editor => {
211
+ new ExportFidusFile(editor.getDoc(), editor.mod.db.bibDB, editor.mod.db.imageDB, true, editor.docInfo.token);
212
+ },
213
+ disabled: editor => editor.app.isOffline()
214
+ },
215
+ {
216
+ title: gettext("Print/PDF"),
217
+ type: "action",
218
+ //icon: 'print',
219
+ tooltip: gettext("Either print or create a PDF using your browser print dialog."),
220
+ order: 5,
221
+ keys: "Ctrl-p",
222
+ action: editor => {
223
+ import("@fiduswriter/document/exporter/print/index").then(({ PrintExporter }) => {
224
+ const doc = editor.getDoc({
225
+ changes: "acceptAllNoInsertions"
226
+ });
227
+ const title = shortFileTitle(doc.title, doc.path || "");
228
+ const task = addProgress("info", `${title}: ${gettext("Preparing print view...")}`, { autoClose: false });
229
+ const exporter = new PrintExporter(doc, editor.mod.db.bibDB, editor.mod.db.imageDB, editor.app.csl, editor.docInfo.updated, editor.mod.documentTemplate.documentStyles, (message, percentage) => task.update(percentage, message));
230
+ exporter.init();
231
+ });
232
+ }
233
+ },
234
+ {
235
+ title: gettext("Change password"),
236
+ type: "action",
237
+ tooltip: gettext("Change the password of this encrypted document."),
238
+ order: 6,
239
+ available: editor => editor.docInfo.e2ee,
240
+ action: async (editor) => {
241
+ if (!editor.e2ee?.key) {
242
+ addAlert("error", gettext("Document key is not available. Please reload the document."));
243
+ return;
244
+ }
245
+ const isPassphraseUser = editor.e2ee?.usesPassphrase &&
246
+ PassphraseManager.hasKeysInSession();
247
+ const suggestedNewPassword = isPassphraseUser
248
+ ? await PassphraseManager.generateDocumentPassword()
249
+ : "";
250
+ let changeOptions;
251
+ if (isPassphraseUser) {
252
+ // Passphrase users: current password is known, new password
253
+ // is auto-generated and shown in plaintext for sharing.
254
+ changeOptions = {
255
+ currentPassword: editor.e2ee.password ||
256
+ E2EEKeyManager.getPasswordFromSession(editor.docInfo.id) ||
257
+ "",
258
+ suggestedNewPassword,
259
+ hideCurrentPassword: true,
260
+ showNewPasswordPlaintext: true,
261
+ infoText: gettext("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.")
262
+ };
263
+ }
264
+ else {
265
+ // Non-passphrase users: prefill current password from
266
+ // sessionStorage if available, but keep it visible for
267
+ // verification.
268
+ const sessionPassword = E2EEKeyManager.getPasswordFromSession(editor.docInfo.id);
269
+ changeOptions = {
270
+ currentPassword: sessionPassword || "",
271
+ suggestedNewPassword: ""
272
+ };
273
+ }
274
+ changePasswordDialog(async ({ currentPassword, newPassword }) => {
275
+ try {
276
+ // Verify the current password.
277
+ // If the entered password matches what is already cached
278
+ // in memory or sessionStorage, the document is already
279
+ // open with that key — skip the expensive PBKDF2
280
+ // re-derivation used only to prove correctness.
281
+ const cachedPassword = editor.e2ee.password ||
282
+ E2EEKeyManager.getPasswordFromSession(editor.docInfo.id);
283
+ if (!cachedPassword ||
284
+ currentPassword !== cachedPassword) {
285
+ const currentSaltBytes = new Uint8Array(atob(editor.e2ee.encryptionSalt)
286
+ .split("")
287
+ .map(c => c.charCodeAt(0)));
288
+ const currentKey = await E2EEKeyManager.resolvePasswordToKey(currentPassword, currentSaltBytes, editor.e2ee.encryptionIterations);
289
+ const { E2EEEncryptor } = await import("../../e2ee/encryptor");
290
+ const testValue = "test";
291
+ const encryptedTest = await E2EEEncryptor.encrypt(testValue, currentKey);
292
+ await E2EEEncryptor.decrypt(encryptedTest, editor.e2ee.key);
293
+ }
294
+ // Current password verified — generate new salt and key
295
+ const newSalt = E2EEKeyManager.generateSalt();
296
+ const newSaltBase64 = btoa(String.fromCharCode(...newSalt));
297
+ const newIterations = 600000;
298
+ const newKey = await E2EEKeyManager.resolvePasswordToKey(newPassword, newSalt, newIterations);
299
+ // Re-encrypt the document with the new key
300
+ await editor.e2ee.snapshotManager.reEncryptWithNewKey(newKey, newSaltBase64, newIterations);
301
+ // Update local E2EE state
302
+ editor.e2ee.encryptionSalt = newSaltBase64;
303
+ editor.e2ee.encryptionIterations =
304
+ newIterations;
305
+ editor.e2ee.key = newKey;
306
+ editor.e2ee.password = newPassword;
307
+ // Cache password and key in sessionStorage
308
+ E2EEKeyManager.storePasswordInSession(editor.docInfo.id, newPassword);
309
+ await E2EEKeyManager.storeKeyInSession(editor.docInfo.id, newKey);
310
+ // If passphrase user, update encrypted password on server
311
+ if (isPassphraseUser) {
312
+ try {
313
+ await PassphraseManager.saveDocumentPassword(editor.docInfo.id, newPassword, null, "user", true);
314
+ }
315
+ catch (_e) {
316
+ console.error("Failed to update document password on server:", _e);
317
+ }
318
+ }
319
+ if (isPassphraseUser) {
320
+ addAlert("success", gettext("Document encryption key rotated. Other passphrase users will receive the new key automatically."));
321
+ }
322
+ else {
323
+ addAlert("success", gettext("Document password changed. Remember to share the new password with your collaborators."));
324
+ }
325
+ }
326
+ catch (_error) {
327
+ addAlert("error", gettext("The current password is incorrect."));
328
+ }
329
+ }, changeOptions);
330
+ },
331
+ disabled: editor => !editor.e2ee?.encrypted ||
332
+ editor.docInfo.access_rights !== "write"
333
+ }
334
+ ]
335
+ },
336
+ {
337
+ id: "export",
338
+ title: gettext("Export"),
339
+ tooltip: gettext("Export of the document contents"),
340
+ type: "menu",
341
+ order: 1,
342
+ keys: "Alt-e",
343
+ content: [
344
+ {
345
+ title: gettext("HTML"),
346
+ type: "action",
347
+ tooltip: gettext("Export the document to an HTML file."),
348
+ order: 0,
349
+ action: editor => {
350
+ import("@fiduswriter/document/exporter/html/index").then(({ HTMLExporter }) => {
351
+ const doc = editor.getDoc({
352
+ changes: "acceptAllNoInsertions"
353
+ });
354
+ const exporter = new HTMLExporter(doc, editor.mod.db.bibDB, editor.mod.db.imageDB, editor.app.csl, editor.docInfo.updated, editor.mod.documentTemplate.documentStyles);
355
+ exporter.progressCallback = exportProgress(doc);
356
+ exporter.init();
357
+ });
358
+ }
359
+ },
360
+ {
361
+ title: gettext("Epub"),
362
+ type: "action",
363
+ tooltip: gettext("Export the document to an Epub electronic reader file."),
364
+ order: 1,
365
+ action: editor => {
366
+ import("@fiduswriter/document/exporter/epub/index").then(({ EpubExporter }) => {
367
+ const doc = editor.getDoc({
368
+ changes: "acceptAllNoInsertions"
369
+ });
370
+ const exporter = new EpubExporter(doc, editor.mod.db.bibDB, editor.mod.db.imageDB, editor.app.csl, editor.docInfo.updated, editor.mod.documentTemplate.documentStyles);
371
+ exporter.progressCallback = exportProgress(doc);
372
+ exporter.init();
373
+ });
374
+ },
375
+ disabled: editor => editor.app.isOffline()
376
+ },
377
+ {
378
+ title: gettext("LaTeX"),
379
+ type: "action",
380
+ tooltip: gettext("Export the document to an LaTeX file."),
381
+ order: 2,
382
+ action: editor => {
383
+ import("@fiduswriter/document/exporter/latex/index").then(({ LatexExporter }) => {
384
+ const doc = editor.getDoc({
385
+ changes: "acceptAllNoInsertions"
386
+ });
387
+ const exporter = new LatexExporter(doc, editor.mod.db.bibDB, editor.mod.db.imageDB, editor.docInfo.updated);
388
+ exporter.progressCallback = exportProgress(doc);
389
+ exporter.init();
390
+ });
391
+ },
392
+ disabled: editor => editor.app.isOffline()
393
+ },
394
+ {
395
+ title: gettext("JATS"),
396
+ type: "action",
397
+ tooltip: gettext("Export the document to a Journal Archiving and Interchange Tag Library NISO JATS Version 1.2 file."),
398
+ order: 2,
399
+ action: editor => {
400
+ import("@fiduswriter/document/exporter/jats/index").then(({ JATSExporter }) => {
401
+ const doc = editor.getDoc({
402
+ changes: "acceptAllNoInsertions"
403
+ });
404
+ const exporter = new JATSExporter(doc, editor.mod.db.bibDB, editor.mod.db.imageDB, editor.app.csl, editor.docInfo.updated, "article");
405
+ exporter.progressCallback = exportProgress(doc);
406
+ exporter.init();
407
+ });
408
+ },
409
+ disabled: editor => editor.app.isOffline()
410
+ },
411
+ {
412
+ title: gettext("BITS"),
413
+ type: "action",
414
+ tooltip: gettext("Export the document to a Book Interchange Tag Set BITS Version 2.1 file."),
415
+ order: 2,
416
+ action: editor => {
417
+ import("@fiduswriter/document/exporter/jats/index").then(({ JATSExporter }) => {
418
+ const doc = editor.getDoc({
419
+ changes: "acceptAllNoInsertions"
420
+ });
421
+ const exporter = new JATSExporter(doc, editor.mod.db.bibDB, editor.mod.db.imageDB, editor.app.csl, editor.docInfo.updated, "book-part-wrapper");
422
+ exporter.progressCallback = exportProgress(doc);
423
+ exporter.init();
424
+ });
425
+ },
426
+ disabled: editor => editor.app.isOffline()
427
+ },
428
+ {
429
+ title: gettext("Pandoc JSON"),
430
+ type: "action",
431
+ tooltip: gettext("Export the document to a Pandoc JSON file."),
432
+ order: 3,
433
+ action: editor => {
434
+ import("@fiduswriter/document/exporter/pandoc/index").then(({ PandocExporter }) => {
435
+ const doc = editor.getDoc({
436
+ changes: "acceptAllNoInsertions"
437
+ });
438
+ const exporter = new PandocExporter(doc, editor.mod.db.bibDB, editor.mod.db.imageDB, editor.app.csl, editor.docInfo.updated);
439
+ exporter.progressCallback = exportProgress(doc);
440
+ exporter.init();
441
+ });
442
+ },
443
+ disabled: editor => editor.app.isOffline()
444
+ },
445
+ {
446
+ title: gettext("Slim FIDUS"),
447
+ type: "action",
448
+ tooltip: gettext("Export the document to a FIDUS file without its template."),
449
+ order: 4,
450
+ action: editor => {
451
+ new ExportFidusFile(editor.getDoc(), editor.mod.db.bibDB, editor.mod.db.imageDB, false);
452
+ }
453
+ }
454
+ ]
455
+ },
456
+ {
457
+ id: "settings",
458
+ title: gettext("Settings"),
459
+ tooltip: gettext("Configure settings of this document."),
460
+ type: "menu",
461
+ order: 2,
462
+ keys: "Alt-s",
463
+ content: [
464
+ {
465
+ id: "citation_style",
466
+ title: gettext("Citation Style"),
467
+ type: "menu",
468
+ tooltip: gettext("Choose your preferred citation style."),
469
+ order: 1,
470
+ disabled: editor => {
471
+ return editor.docInfo.access_rights !== "write";
472
+ },
473
+ content: []
474
+ },
475
+ {
476
+ id: "document_style",
477
+ title: gettext("Document Style"),
478
+ type: "menu",
479
+ tooltip: gettext("Choose your preferred document style."),
480
+ order: 2,
481
+ disabled: editor => {
482
+ return (editor.docInfo.access_rights !== "write" ||
483
+ editor.app.isOffline());
484
+ },
485
+ content: []
486
+ },
487
+ {
488
+ id: "language",
489
+ title: gettext("Text Language"),
490
+ type: "menu",
491
+ tooltip: gettext("Choose the language of the document."),
492
+ order: 3,
493
+ disabled: editor => {
494
+ return editor.docInfo.access_rights !== "write";
495
+ },
496
+ content: [
497
+ languageItem("en-US", gettext("English (United States)"), 0),
498
+ languageItem("en-GB", gettext("English (United Kingdom)"), 1),
499
+ languageItem("de-DE", gettext("German (Germany)"), 2),
500
+ languageItem("zh-CN", gettext("Chinese (Simplified)"), 3),
501
+ languageItem("es", gettext("Spanish"), 4),
502
+ languageItem("fr", gettext("French"), 5),
503
+ languageItem("ja", gettext("Japanese"), 6),
504
+ languageItem("it", gettext("Italian"), 7),
505
+ //languageItem('pl', gettext('Polish'), 8),
506
+ languageItem("pt-BR", gettext("Portuguese (Brazil)"), 9),
507
+ //languageItem('nl', gettext('Dutch'), 10),
508
+ //languageItem('ru', gettext('Russian'), 11),
509
+ {
510
+ type: "separator",
511
+ order: 12,
512
+ available: editor => {
513
+ // There has to be at least one language of the default languages
514
+ // among the default ones and one that is not among the default ones.
515
+ return (!!editor.view.state.doc.attrs.languages.find(lang => [
516
+ "en-US",
517
+ "en-GB",
518
+ "de-DE",
519
+ "zh-CN",
520
+ "es",
521
+ "fr",
522
+ "ja",
523
+ "it",
524
+ "pl",
525
+ "pt-BR",
526
+ "nl",
527
+ "ru"
528
+ ].includes(lang)) &&
529
+ !!editor.view.state.doc.attrs.languages.find(lang => ![
530
+ "en-US",
531
+ "en-GB",
532
+ "de-DE",
533
+ "zh-CN",
534
+ "es",
535
+ "fr",
536
+ "ja",
537
+ "it",
538
+ "pl",
539
+ "pt-BR",
540
+ "nl",
541
+ "ru"
542
+ ].includes(lang)));
543
+ }
544
+ },
545
+ {
546
+ title: gettext("Other"),
547
+ type: "setting",
548
+ order: 13,
549
+ action: editor => {
550
+ const language = editor.view.state.doc.attrs.language, dialog = new LanguageDialog(editor, language);
551
+ dialog.init();
552
+ },
553
+ selected: editor => {
554
+ return ![
555
+ "en-US",
556
+ "en-GB",
557
+ "de-DE",
558
+ "zh-CN",
559
+ "es",
560
+ "fr",
561
+ "ja",
562
+ "it",
563
+ "pl",
564
+ "pt-BR",
565
+ "nl",
566
+ "ru"
567
+ ].includes(editor.view.state.doc.attrs.language);
568
+ },
569
+ available: editor => !!editor.view.state.doc.attrs.languages.find(lang => ![
570
+ "en-US",
571
+ "en-GB",
572
+ "de-DE",
573
+ "zh-CN",
574
+ "es",
575
+ "fr",
576
+ "ja",
577
+ "it",
578
+ "pl",
579
+ "pt-BR",
580
+ "nl",
581
+ "ru"
582
+ ].includes(lang))
583
+ }
584
+ ]
585
+ },
586
+ {
587
+ id: "paper_size",
588
+ title: gettext("Paper Size"),
589
+ type: "menu",
590
+ tooltip: gettext("Choose a papersize for print and PDF generation."),
591
+ order: 4,
592
+ disabled: editor => {
593
+ return editor.docInfo.access_rights !== "write";
594
+ },
595
+ content: [
596
+ {
597
+ title: gettext("DIN A4"),
598
+ type: "setting",
599
+ tooltip: gettext("A4 (DIN A4/ISO 216) which is used in most of the world."),
600
+ order: 0,
601
+ action: editor => {
602
+ editor.view.dispatch(editor.view.state.tr
603
+ .setDocAttribute("papersize", "A4")
604
+ .setMeta("settings", true));
605
+ },
606
+ selected: editor => {
607
+ return (editor.view.state.doc.attrs.papersize ===
608
+ "A4");
609
+ },
610
+ available: editor => {
611
+ return editor.view.state.doc.attrs.papersizes.includes("A4");
612
+ }
613
+ },
614
+ {
615
+ title: gettext("US Letter"),
616
+ type: "setting",
617
+ tooltip: gettext("The format used by the USA and some other American countries."),
618
+ order: 1,
619
+ action: editor => {
620
+ editor.view.dispatch(editor.view.state.tr
621
+ .setDocAttribute("papersize", "US Letter")
622
+ .setMeta("settings", true));
623
+ },
624
+ selected: editor => {
625
+ return (editor.view.state.doc.attrs.papersize ===
626
+ "US Letter");
627
+ },
628
+ available: editor => {
629
+ return editor.view.state.doc.attrs.papersizes.includes("US Letter");
630
+ }
631
+ }
632
+ ]
633
+ },
634
+ {
635
+ title: gettext("Copyright Information"),
636
+ type: "setting",
637
+ order: 5,
638
+ action: editor => {
639
+ const dialog = new CopyrightDialog(editor.view.state.doc.attrs.copyright);
640
+ dialog.init().then(copyright => {
641
+ if (copyright) {
642
+ editor.view.dispatch(editor.view.state.tr
643
+ .setDocAttribute("copyright", copyright)
644
+ .setMeta("settings", true));
645
+ }
646
+ editor.currentView.focus();
647
+ });
648
+ },
649
+ disabled: editor => editor.docInfo.access_rights !== "write"
650
+ }
651
+ ]
652
+ },
653
+ {
654
+ id: "tools",
655
+ title: gettext("Tools"),
656
+ tooltip: gettext("Select document editing tool."),
657
+ type: "menu",
658
+ order: 3,
659
+ keys: "Alt-t",
660
+ content: [
661
+ {
662
+ title: gettext("Word counter"),
663
+ type: "action",
664
+ tooltip: gettext("See document statistics."),
665
+ order: 0,
666
+ action: editor => {
667
+ const dialog = new WordCountDialog(editor);
668
+ dialog.init();
669
+ }
670
+ },
671
+ {
672
+ title: gettext("Search and replace"),
673
+ type: "action",
674
+ tooltip: gettext("Show a search and replace dialog."),
675
+ order: 1,
676
+ keys: "Ctrl-h",
677
+ action: editor => {
678
+ const dialog = new SearchReplaceDialog(editor);
679
+ dialog.init();
680
+ }
681
+ },
682
+ {
683
+ title: gettext("Keyboard shortcuts"),
684
+ type: "action",
685
+ tooltip: gettext("Show an overview of available keyboard shortcuts."),
686
+ order: 2,
687
+ keys: "Shift-Ctrl-/",
688
+ action: editor => {
689
+ const dialog = new KeyBindingsDialog(editor);
690
+ dialog.init();
691
+ }
692
+ }
693
+ ]
694
+ },
695
+ {
696
+ title: gettext("Track changes"),
697
+ type: "menu",
698
+ tooltip: gettext("Tracking changes to the document"),
699
+ order: 4,
700
+ keys: "Alt-c",
701
+ disabled: editor => editor.docInfo.access_rights !== "write",
702
+ content: [
703
+ {
704
+ title: gettext("Record"),
705
+ type: "setting",
706
+ tooltip: gettext("Record document changes"),
707
+ order: 0,
708
+ disabled: editor => {
709
+ return editor.docInfo.access_rights !== "write";
710
+ },
711
+ action: editor => {
712
+ const tracked = !editor.view.state.doc.attrs.tracked;
713
+ editor.view.dispatch(editor.view.state.tr
714
+ .setDocAttribute("tracked", tracked)
715
+ .setMeta("settings", true));
716
+ },
717
+ selected: editor => {
718
+ return editor.view.state.doc.attrs.tracked === true;
719
+ }
720
+ },
721
+ {
722
+ title: gettext("Accept all"),
723
+ type: "action",
724
+ tooltip: gettext("Accept all tracked changes."),
725
+ order: 1,
726
+ action: editor => {
727
+ editor.mod.track.acceptAll();
728
+ }
729
+ },
730
+ {
731
+ title: gettext("Reject all"),
732
+ type: "action",
733
+ tooltip: gettext("Reject all tracked changes."),
734
+ order: 2,
735
+ action: editor => {
736
+ editor.mod.track.rejectAll();
737
+ }
738
+ }
739
+ ]
740
+ }
741
+ ]
742
+ });
743
+ //# sourceMappingURL=model.js.map