@manuscripts/body-editor 3.12.67 → 3.13.1

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 (289) hide show
  1. package/dist/cjs/components/toolbar/type-selector/styles.js +2 -1
  2. package/dist/cjs/versions.js +1 -1
  3. package/dist/es/components/toolbar/type-selector/styles.js +2 -1
  4. package/dist/es/versions.js +1 -1
  5. package/dist/types/components/toolbar/type-selector/styles.d.ts +2 -2
  6. package/dist/types/lib/footnotes.d.ts +4 -2
  7. package/dist/types/lib/utils.d.ts +5 -4
  8. package/dist/types/versions.d.ts +1 -1
  9. package/package.json +37 -36
  10. package/{dist/es/lib/statistics.js → src/__mocks__/styleMock.ts} +2 -14
  11. package/src/assets.ts +20 -0
  12. package/src/classes/collabProvider.ts +38 -0
  13. package/src/clipboard.ts +54 -0
  14. package/src/commands.ts +2109 -0
  15. package/src/components/ChangeHandlingForm.tsx +54 -0
  16. package/src/components/LanguageDropdown/index.tsx +343 -0
  17. package/src/components/affiliations/AffiliationForm.tsx +238 -0
  18. package/src/components/affiliations/AffiliationItem.tsx +151 -0
  19. package/src/components/affiliations/AffiliationList.tsx +71 -0
  20. package/src/components/affiliations/AffiliationsModal.tsx +676 -0
  21. package/src/components/affiliations/AffiliationsPanel.tsx +76 -0
  22. package/src/components/affiliations/CreateAffiliationModal.tsx +135 -0
  23. package/src/components/authors/AuthorDetailsForm.tsx +438 -0
  24. package/src/components/authors/AuthorList.tsx +81 -0
  25. package/src/components/authors/AuthorsModal.tsx +642 -0
  26. package/src/components/authors/AuthorsPanel.tsx +69 -0
  27. package/src/components/authors/CreateAuthorModal.tsx +172 -0
  28. package/src/components/authors/CreditDrawer.tsx +71 -0
  29. package/src/components/authors/DraggableAuthor.tsx +228 -0
  30. package/src/components/authors/useManageAffiliations.tsx +77 -0
  31. package/src/components/authors/useManageCredit.tsx +63 -0
  32. package/src/components/authors-affiliations/AuthorsAndAffiliationsModals.tsx +170 -0
  33. package/src/components/authors-affiliations/GenericPanel.tsx +164 -0
  34. package/src/components/authors-affiliations/ModalTabs.tsx +100 -0
  35. package/src/components/awards/AwardForm.tsx +338 -0
  36. package/src/components/awards/AwardModal.tsx +120 -0
  37. package/src/components/awards/DeleteAwardDiaolog.tsx +52 -0
  38. package/src/components/dialog/ConfirmationDialog.tsx +131 -0
  39. package/src/components/form/CreateModalStyles.tsx +37 -0
  40. package/src/components/form/FormFooter.tsx +54 -0
  41. package/src/components/form/FormPlaceholder.tsx +71 -0
  42. package/src/components/form/ModalFormActions.tsx +88 -0
  43. package/src/components/form/UnsavedLabel.tsx +49 -0
  44. package/src/components/hooks/use-debounce.ts +56 -0
  45. package/src/components/hooks/useAffiliationShowsErrorIndicator.ts +51 -0
  46. package/src/components/hooks/useAuthorShowsErrorIndicator.ts +73 -0
  47. package/src/components/keyboard-shortcuts-modal/FormattedShortcut.tsx +56 -0
  48. package/src/components/keyboard-shortcuts-modal/KeyboardShortcutsModal.tsx +283 -0
  49. package/src/components/keyboard-shortcuts-modal/keyboard-shortcuts.ts +304 -0
  50. package/src/components/keywords/AddKeywordInline.tsx +284 -0
  51. package/src/components/keywords/DeleteKeywordDialog.tsx +52 -0
  52. package/src/components/modal-drawer/GenericDrawer.tsx +65 -0
  53. package/src/components/modal-drawer/GenericDrawerGroup.tsx +125 -0
  54. package/src/components/outline/DraggableTree.tsx +438 -0
  55. package/src/components/outline/ManuscriptOutline.tsx +127 -0
  56. package/src/components/outline/Outline.tsx +141 -0
  57. package/src/components/references/BibliographyItemSource.ts +80 -0
  58. package/src/components/references/CitationEditor.tsx +301 -0
  59. package/src/components/references/CitationViewer.tsx +62 -0
  60. package/src/components/references/ImportBibliographyForm.tsx +232 -0
  61. package/src/components/references/ImportBibliographyModal.tsx +159 -0
  62. package/src/components/references/ReferenceForm/PersonDropDown.tsx +93 -0
  63. package/src/components/references/ReferenceForm/ReferenceForm.tsx +701 -0
  64. package/src/components/references/ReferenceForm/config.ts +133 -0
  65. package/src/components/references/ReferenceForm/styled-components.ts +156 -0
  66. package/src/components/references/ReferenceLine.tsx +43 -0
  67. package/src/components/references/ReferenceSearch.tsx +163 -0
  68. package/src/components/references/ReferenceSearchResults.tsx +113 -0
  69. package/src/components/references/ReferenceSearchResultsPlaceholder.tsx +71 -0
  70. package/src/components/references/ReferenceSearchSection.tsx +124 -0
  71. package/src/components/references/ReferencesEditor.tsx +61 -0
  72. package/src/components/references/ReferencesModal.tsx +352 -0
  73. package/src/components/references/SearchInput.tsx +98 -0
  74. package/src/components/toolbar/InsertEmbedDialog.tsx +222 -0
  75. package/src/components/toolbar/InsertTableDialog.tsx +208 -0
  76. package/src/components/toolbar/ListMenuItem.tsx +203 -0
  77. package/src/components/toolbar/helpers.ts +547 -0
  78. package/src/components/toolbar/type-selector/OptionComponent.tsx +89 -0
  79. package/src/components/toolbar/type-selector/TypeSelector.tsx +157 -0
  80. package/src/components/toolbar/type-selector/styles.ts +79 -0
  81. package/src/components/views/CrossReferenceItems.tsx +199 -0
  82. package/src/components/views/DeleteEmbedDialog.tsx +83 -0
  83. package/src/components/views/DeleteFootnoteDialog.tsx +54 -0
  84. package/src/components/views/FigureDropdown.tsx +423 -0
  85. package/src/components/views/FootnotesSelector.tsx +255 -0
  86. package/src/components/views/InsertSpecialCharacter.tsx +245 -0
  87. package/src/components/views/LinkForm.tsx +220 -0
  88. package/src/components/views/TableCellContextMenu.tsx +241 -0
  89. package/src/configs/ManuscriptsEditor.ts +140 -0
  90. package/src/configs/editor-plugins.ts +119 -0
  91. package/src/configs/editor-views.ts +139 -0
  92. package/src/icons.ts +62 -0
  93. package/src/index.ts +65 -0
  94. package/src/keys/highlight.ts +65 -0
  95. package/src/keys/index.ts +33 -0
  96. package/src/keys/keyword.ts +69 -0
  97. package/src/keys/list.ts +156 -0
  98. package/src/keys/misc.ts +112 -0
  99. package/src/keys/title.ts +221 -0
  100. package/src/lib/__tests__/__fixtures__/doc.json +388 -0
  101. package/src/lib/__tests__/__snapshots__/paste.test.ts.snap +24 -0
  102. package/src/lib/__tests__/authors.test.ts +202 -0
  103. package/src/lib/__tests__/helpers.test.ts +46 -0
  104. package/src/lib/__tests__/paste.test.ts +57 -0
  105. package/src/lib/__tests__/plugins.test.ts +176 -0
  106. package/src/lib/__tests__/url.test.ts +31 -0
  107. package/src/lib/array-reducer.ts +68 -0
  108. package/src/lib/authors-and-affiliations.ts +81 -0
  109. package/src/lib/authors.ts +67 -0
  110. package/src/lib/capabilities.ts +55 -0
  111. package/src/lib/codemirror.ts +37 -0
  112. package/src/lib/comments.ts +123 -0
  113. package/src/lib/context-menu.ts +745 -0
  114. package/src/lib/copy.ts +30 -0
  115. package/src/lib/crossref.ts +90 -0
  116. package/src/lib/dnd.ts +29 -0
  117. package/src/lib/doc.ts +167 -0
  118. package/src/lib/dompurify.ts +28 -0
  119. package/src/lib/files.ts +180 -0
  120. package/src/lib/footnotes.ts +83 -0
  121. package/src/lib/get-media-type.ts +105 -0
  122. package/src/lib/helpers.ts +199 -0
  123. package/src/lib/hierarchy.ts +117 -0
  124. package/src/lib/languages.ts +37 -0
  125. package/src/lib/lists.ts +56 -0
  126. package/src/lib/math.ts +111 -0
  127. package/src/lib/media.ts +334 -0
  128. package/src/lib/navigation-utils.ts +235 -0
  129. package/src/lib/normalize.ts +70 -0
  130. package/src/lib/paste.ts +304 -0
  131. package/src/lib/placeholder.ts +32 -0
  132. package/src/lib/platform.ts +18 -0
  133. package/src/lib/plugins.ts +22 -0
  134. package/src/lib/popper.ts +180 -0
  135. package/src/lib/position-menu.ts +184 -0
  136. package/src/lib/references.ts +94 -0
  137. package/src/lib/template.ts +29 -0
  138. package/src/lib/track-changes-utils.ts +34 -0
  139. package/{dist/types/lib/statistics.d.ts → src/lib/url.ts} +11 -8
  140. package/src/lib/use-do-with-debounce.ts +39 -0
  141. package/src/lib/utils.ts +323 -0
  142. package/src/lib/view.ts +100 -0
  143. package/src/menus.tsx +684 -0
  144. package/src/node-type-icons.tsx +83 -0
  145. package/src/plugins/__tests__/__fixtures__/deleted-footnote.json +140 -0
  146. package/src/plugins/__tests__/__fixtures__/inserted-footnote.json +153 -0
  147. package/src/plugins/__tests__/footnotes.test.ts +67 -0
  148. package/src/plugins/accessibility_element.ts +219 -0
  149. package/src/plugins/add-subtitle.ts +102 -0
  150. package/src/plugins/affiliations.ts +136 -0
  151. package/src/plugins/alt-titles.ts +219 -0
  152. package/src/plugins/bibliography.ts +235 -0
  153. package/src/plugins/comments.ts +328 -0
  154. package/src/plugins/cross-references.ts +70 -0
  155. package/src/plugins/detect-inconsistency/detect-inconsistency-utils.ts +102 -0
  156. package/src/plugins/detect-inconsistency/index.ts +55 -0
  157. package/src/plugins/detect-inconsistency/validators.ts +283 -0
  158. package/src/plugins/doi.ts +66 -0
  159. package/src/plugins/editor-props.ts +39 -0
  160. package/src/plugins/elements.ts +60 -0
  161. package/src/plugins/footnotes.ts +298 -0
  162. package/src/plugins/link.ts +53 -0
  163. package/src/plugins/lock-body.ts +136 -0
  164. package/src/plugins/move-node.ts +55 -0
  165. package/src/plugins/objects.ts +125 -0
  166. package/src/plugins/paragraphs.ts +90 -0
  167. package/src/plugins/persist.ts +64 -0
  168. package/src/plugins/persistent-cursor.ts +66 -0
  169. package/src/plugins/placeholder.ts +219 -0
  170. package/src/plugins/prevent-empty.ts +50 -0
  171. package/src/plugins/search-replace/index.ts +157 -0
  172. package/src/plugins/search-replace/lib.ts +95 -0
  173. package/src/plugins/section_category.ts +212 -0
  174. package/src/plugins/section_title/autocompletion.ts +87 -0
  175. package/src/plugins/section_title/index.ts +105 -0
  176. package/src/plugins/selected-suggestion.ts +243 -0
  177. package/src/plugins/tables-cursor-fix.ts +143 -0
  178. package/src/plugins/translations.ts +263 -0
  179. package/src/rules.ts +60 -0
  180. package/src/selection.ts +112 -0
  181. package/src/testing/default-capabilities.ts +48 -0
  182. package/src/testing/default-editor-data.ts +73 -0
  183. package/src/testing/empty-editor-doc.json +62 -0
  184. package/src/testing/polyfill-dom.ts +43 -0
  185. package/src/testing/section-categories.json +161 -0
  186. package/src/testing/setup-editor.ts +55 -0
  187. package/src/tests.ts +42 -0
  188. package/src/toolbar.tsx +259 -0
  189. package/src/types/@citation-js/core.d.ts +16 -0
  190. package/src/types/@citation-js/index.d.ts +16 -0
  191. package/src/types/@citation-js/plugin-bibtex.d.ts +16 -0
  192. package/src/types/@citation-js/plugin-csl.d.ts +16 -0
  193. package/src/types/@citation-js/plugin-doi.d.ts +16 -0
  194. package/src/types/@citation-js/plugin-enw.d.ts +16 -0
  195. package/src/types/@citation-js/plugin-pubmed.d.ts +16 -0
  196. package/src/types/@citation-js/plugin-ris.d.ts +16 -0
  197. package/src/types/citeproc.d.ts +124 -0
  198. package/src/types/css.d.ts +16 -0
  199. package/src/types/json.d.ts +17 -0
  200. package/src/types/prosemirror-dev-tools.d.ts +16 -0
  201. package/src/types/prosemirror-dropcursor.d.ts +16 -0
  202. package/src/types/styled-components.d.ts +23 -0
  203. package/src/types.ts +49 -0
  204. package/src/useEditor.ts +244 -0
  205. package/src/versions.ts +3 -0
  206. package/src/views/ReactSubView.tsx +145 -0
  207. package/src/views/abstracts.ts +46 -0
  208. package/src/views/accessibility_element.ts +86 -0
  209. package/src/views/affiliations.ts +254 -0
  210. package/src/views/alt_title.ts +85 -0
  211. package/src/views/alt_titles_section.ts +97 -0
  212. package/src/views/attachment.ts +160 -0
  213. package/src/views/attachments.ts +72 -0
  214. package/src/views/author_notes.ts +96 -0
  215. package/src/views/award.ts +194 -0
  216. package/src/views/awards.ts +59 -0
  217. package/src/views/base_node_view.ts +85 -0
  218. package/src/views/bibliography_element.ts +313 -0
  219. package/src/views/block_view.ts +100 -0
  220. package/src/views/blockquote_element.ts +26 -0
  221. package/src/views/blockquote_element_editable.ts +24 -0
  222. package/src/views/box_element.ts +33 -0
  223. package/src/views/caption.ts +37 -0
  224. package/src/views/caption_title.ts +33 -0
  225. package/src/views/citation.ts +67 -0
  226. package/src/views/citation_editable.ts +312 -0
  227. package/src/views/contributors.ts +341 -0
  228. package/src/views/creators.ts +82 -0
  229. package/src/views/cross_reference.ts +74 -0
  230. package/src/views/cross_reference_editable.ts +113 -0
  231. package/src/views/editable_block.ts +141 -0
  232. package/src/views/embed.ts +345 -0
  233. package/src/views/empty.ts +26 -0
  234. package/src/views/equation.ts +47 -0
  235. package/src/views/equation_editable.ts +84 -0
  236. package/src/views/equation_element.ts +29 -0
  237. package/src/views/equation_element_editable.ts +21 -0
  238. package/src/views/figure.ts +84 -0
  239. package/src/views/figure_editable.ts +361 -0
  240. package/src/views/figure_element.ts +197 -0
  241. package/src/views/figure_element_editable.ts +21 -0
  242. package/src/views/footnote.ts +236 -0
  243. package/src/views/footnotes_element.ts +54 -0
  244. package/src/views/general_table_footnote.ts +140 -0
  245. package/src/views/hero_image.ts +76 -0
  246. package/src/views/hero_image_editable.ts +21 -0
  247. package/src/views/image_element.ts +373 -0
  248. package/src/views/image_element_editable.ts +21 -0
  249. package/src/views/inline_equation.ts +47 -0
  250. package/src/views/inline_equation_editable.ts +70 -0
  251. package/src/views/inline_footnote.ts +264 -0
  252. package/src/views/inline_footnote_editable.ts +20 -0
  253. package/src/views/keyword.ts +127 -0
  254. package/src/views/keyword_group.ts +109 -0
  255. package/src/views/link.ts +27 -0
  256. package/src/views/link_editable.ts +169 -0
  257. package/src/views/list.ts +46 -0
  258. package/src/views/list_item.ts +26 -0
  259. package/src/views/paragraph.ts +26 -0
  260. package/src/views/paragraph_editable.ts +21 -0
  261. package/src/views/placeholder.ts +35 -0
  262. package/src/views/placeholder_element.ts +38 -0
  263. package/src/views/placeholder_element_editable.ts +21 -0
  264. package/src/views/pullquote_element.ts +106 -0
  265. package/src/views/pullquote_element_editable.ts +24 -0
  266. package/src/views/quote_image_editable.ts +84 -0
  267. package/src/views/section.ts +64 -0
  268. package/src/views/section_label.ts +20 -0
  269. package/src/views/section_title.ts +87 -0
  270. package/src/views/section_title_editable.ts +21 -0
  271. package/src/views/subtitle.ts +42 -0
  272. package/src/views/subtitle_editable.ts +20 -0
  273. package/src/views/subtitles.ts +34 -0
  274. package/src/views/subtitles_editable.ts +21 -0
  275. package/src/views/supplement.ts +236 -0
  276. package/src/views/supplement_editable.ts +20 -0
  277. package/src/views/supplements.ts +65 -0
  278. package/src/views/supplements_editable.ts +21 -0
  279. package/src/views/table_cell.ts +150 -0
  280. package/src/views/table_element.ts +33 -0
  281. package/src/views/table_element_editable.ts +21 -0
  282. package/src/views/table_element_footer.ts +41 -0
  283. package/src/views/title.ts +46 -0
  284. package/src/views/title_editable.ts +20 -0
  285. package/src/views/trans_graphical_abstract.ts +55 -0
  286. package/src/views/trans_graphical_abstract_editable.ts +21 -0
  287. package/src/views/translated_abstract.ts +53 -0
  288. package/src/views/translated_abstract_editable.ts +21 -0
  289. package/dist/cjs/lib/statistics.js +0 -38
@@ -0,0 +1,69 @@
1
+ /*!
2
+ * © 2019 Atypon Systems LLC
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { ManuscriptEditorState, schema } from '@manuscripts/transform'
18
+
19
+ import { isNodeSelection, isTextSelection } from '../commands'
20
+ import { EditorAction } from '../types'
21
+
22
+ const ignoreEnter: EditorAction = (state) => {
23
+ const { selection } = state
24
+ if (!isTextSelection(selection)) {
25
+ return false
26
+ }
27
+
28
+ const { $from, $to } = selection
29
+ // Check if the selection starts and ends in a keyword node
30
+ const startNode = $from.node($from.depth)
31
+ const endNode = $to.node($to.depth)
32
+
33
+ if (
34
+ startNode.type === state.schema.nodes.keyword ||
35
+ endNode.type === state.schema.nodes.keyword
36
+ ) {
37
+ return true // Ignore Enter key press if selection is within a keyword node
38
+ }
39
+
40
+ return false
41
+ }
42
+
43
+ export const ignoreBackSpace = (state: ManuscriptEditorState) => {
44
+ const { selection } = state
45
+
46
+ if (!isNodeSelection(selection)) {
47
+ return selection.$from.node().type === schema.nodes.keyword
48
+ }
49
+
50
+ return false
51
+ }
52
+
53
+ export const ignoreDelete = (state: ManuscriptEditorState) => {
54
+ const { selection } = state
55
+
56
+ if (!isTextSelection(selection)) {
57
+ return false
58
+ }
59
+
60
+ return selection.$from.node().type === schema.nodes.keyword
61
+ }
62
+
63
+ const keywordKeymap: { [key: string]: EditorAction } = {
64
+ Enter: ignoreEnter,
65
+ Delete: ignoreDelete,
66
+ Backspace: ignoreBackSpace,
67
+ }
68
+
69
+ export default keywordKeymap
@@ -0,0 +1,156 @@
1
+ /*!
2
+ * © 2019 Atypon Systems LLC
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { skipTracking } from '@manuscripts/track-changes-plugin'
18
+ import { ManuscriptEditorState, schema } from '@manuscripts/transform'
19
+ import { joinBackward } from 'prosemirror-commands'
20
+ import { Fragment, NodeType, Slice } from 'prosemirror-model'
21
+ import {
22
+ liftListItem,
23
+ splitListItem,
24
+ wrapInList,
25
+ } from 'prosemirror-schema-list'
26
+ import { Command, EditorState, Transaction } from 'prosemirror-state'
27
+ import { ReplaceAroundStep } from 'prosemirror-transform'
28
+ import { findParentNodeOfType } from 'prosemirror-utils'
29
+
30
+ import { Dispatch } from '../commands'
31
+ import { EditorAction } from '../types'
32
+
33
+ // TODO:: remove this command when quarterback start supporting list_item and the operation on the list
34
+ export const skipCommandTracking =
35
+ (command: Command) => (state: ManuscriptEditorState, dispatch?: Dispatch) => {
36
+ return command(state, (tr) => {
37
+ if (dispatch) {
38
+ skipTracking(tr)
39
+ dispatch(tr)
40
+ }
41
+ })
42
+ }
43
+
44
+ const listItemBackward = (
45
+ state: EditorState,
46
+ dispatch?: (tr: Transaction) => void
47
+ ) => {
48
+ const { selection } = state
49
+ const isListItem = findParentNodeOfType(schema.nodes.list_item)(selection)
50
+
51
+ if (isListItem) {
52
+ return joinBackward(state, dispatch)
53
+ }
54
+
55
+ return false
56
+ }
57
+
58
+ // Lift the list item if it's inside a parent list.
59
+ const liftToOuterList = (itemType: NodeType): Command => {
60
+ return function (state: EditorState, dispatch?: (tr: Transaction) => void) {
61
+ const { $from, $to } = state.selection
62
+ const range = $from.blockRange(
63
+ $to,
64
+ (node) => node.childCount > 0 && node.firstChild?.type == itemType
65
+ )
66
+ if (!range) {
67
+ return false
68
+ }
69
+ if (!dispatch) {
70
+ return true
71
+ }
72
+ if ($from.node(range.depth - 1).type == itemType) {
73
+ // Inside a parent list
74
+ return liftListItem(itemType)(state, dispatch)
75
+ } // Outer list node
76
+ else {
77
+ return false
78
+ }
79
+ }
80
+ }
81
+
82
+ // This fucntion is forked from the prosemirror-schema-list package, since the original function does not support cloning attributes from the parent list.
83
+ export function sinkListItem(itemType: NodeType): Command {
84
+ return function (state, dispatch) {
85
+ const { $from, $to } = state.selection
86
+ const range = $from.blockRange(
87
+ $to,
88
+ (node) => node.childCount > 0 && node.firstChild?.type == itemType
89
+ )
90
+ if (!range) {
91
+ return false
92
+ }
93
+ const startIndex = range.startIndex
94
+ if (startIndex == 0) {
95
+ return false
96
+ }
97
+ const parent = range.parent,
98
+ nodeBefore = parent.child(startIndex - 1)
99
+ if (nodeBefore.type != itemType) {
100
+ return false
101
+ }
102
+ if (dispatch) {
103
+ const nestedBefore =
104
+ nodeBefore.lastChild && nodeBefore.lastChild.type == parent.type
105
+ const listType = parent.attrs.listStyleType
106
+ const inner = Fragment.from(nestedBefore ? itemType.create() : null)
107
+ const slice = new Slice(
108
+ Fragment.from(
109
+ itemType.create(
110
+ null,
111
+ Fragment.from(
112
+ parent.type.create({ listStyleType: listType }, inner)
113
+ )
114
+ )
115
+ ),
116
+ nestedBefore ? 3 : 1,
117
+ 0
118
+ )
119
+ const before = range.start,
120
+ after = range.end
121
+ dispatch(
122
+ state.tr
123
+ .step(
124
+ new ReplaceAroundStep(
125
+ before - (nestedBefore ? 3 : 1),
126
+ after,
127
+ before,
128
+ after,
129
+ slice,
130
+ 1,
131
+ true
132
+ )
133
+ )
134
+ .scrollIntoView()
135
+ )
136
+ }
137
+ return true
138
+ }
139
+ }
140
+
141
+ const listKeymap: { [key: string]: EditorAction } = {
142
+ Enter: splitListItem(schema.nodes.list_item),
143
+ 'Mod-[': skipCommandTracking(liftToOuterList(schema.nodes.list_item)), // outdent
144
+ 'Mod-]': skipCommandTracking(sinkListItem(schema.nodes.list_item)), // indent
145
+ 'Mod-Alt-o': skipCommandTracking(
146
+ wrapInList(schema.nodes.list, { listStyleType: 'order' })
147
+ ),
148
+ 'Mod-Alt-k': skipCommandTracking(
149
+ wrapInList(schema.nodes.list, { listStyleType: 'bullet' })
150
+ ),
151
+ 'Shift-Tab': skipCommandTracking(liftToOuterList(schema.nodes.list_item)), // outdent, same as Mod-[
152
+ Tab: skipCommandTracking(sinkListItem(schema.nodes.list_item)), // indent, same as Mod-]
153
+ Backspace: skipCommandTracking(listItemBackward),
154
+ }
155
+
156
+ export default listKeymap
@@ -0,0 +1,112 @@
1
+ /*!
2
+ * © 2019 Atypon Systems LLC
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { schema } from '@manuscripts/transform'
18
+ import {
19
+ chainCommands,
20
+ createParagraphNear,
21
+ exitCode,
22
+ joinBackward,
23
+ joinDown,
24
+ joinUp,
25
+ lift,
26
+ liftEmptyBlock,
27
+ newlineInCode,
28
+ splitBlock,
29
+ toggleMark,
30
+ wrapIn,
31
+ } from 'prosemirror-commands'
32
+ import { redo, undo } from 'prosemirror-history'
33
+ import { undoInputRule } from 'prosemirror-inputrules'
34
+ import { goToNextCell } from 'prosemirror-tables'
35
+
36
+ import {
37
+ addToStart,
38
+ autoComplete,
39
+ exitEditorToContainer,
40
+ ignoreAtomBlockNodeBackward,
41
+ ignoreAtomBlockNodeForward,
42
+ ignoreEnterInSubtitles,
43
+ ignoreMetaNodeBackspaceCommand,
44
+ insertBlock,
45
+ insertBoxElement,
46
+ insertBreak,
47
+ insertCrossReference,
48
+ insertInlineFootnote,
49
+ insertInlineCitation,
50
+ insertInlineEquation,
51
+ insertLink,
52
+ insertSection,
53
+ selectAllIsolating,
54
+ } from '../commands'
55
+ import { EditorAction } from '../types'
56
+ import { skipCommandTracking } from './list'
57
+ import { focusNearestElement } from '../lib/navigation-utils'
58
+
59
+ const customKeymap: { [key: string]: EditorAction } = {
60
+ Backspace: chainCommands(
61
+ undoInputRule,
62
+ ignoreAtomBlockNodeBackward,
63
+ ignoreMetaNodeBackspaceCommand,
64
+ skipCommandTracking(joinBackward)
65
+ ),
66
+ Delete: ignoreAtomBlockNodeForward,
67
+ Tab: chainCommands(goToNextCell(1), focusNearestElement),
68
+ Escape: exitEditorToContainer,
69
+ 'Mod-z': undo,
70
+ 'Mod-y': redo, // Mac
71
+ 'Shift-Mod-z': redo, // PC
72
+ 'Alt-ArrowUp': joinUp,
73
+ 'Alt-ArrowDown': joinDown,
74
+ 'Mod-BracketLeft': lift,
75
+ 'Mod-a': selectAllIsolating,
76
+ 'Mod-b': toggleMark(schema.marks.bold),
77
+ 'Mod-i': toggleMark(schema.marks.italic),
78
+ 'Shift-Mod-x': toggleMark(schema.marks.strikethrough),
79
+ 'Mod-u': toggleMark(schema.marks.underline),
80
+ // 'Mod-`': toggleMark(schema.marks.code),
81
+ 'Mod-Alt-=': toggleMark(schema.marks.superscript),
82
+ 'Mod-Alt--': toggleMark(schema.marks.subscript),
83
+ 'Ctrl->': wrapIn(schema.nodes.blockquote),
84
+ Enter: chainCommands(
85
+ ignoreEnterInSubtitles,
86
+ autoComplete,
87
+ addToStart,
88
+ newlineInCode,
89
+ createParagraphNear,
90
+ liftEmptyBlock,
91
+ splitBlock
92
+ ),
93
+ 'Shift-Mod-Enter': insertSection(true),
94
+ 'Mod-Enter': chainCommands(exitCode, insertSection()),
95
+ 'Shift-Enter': chainCommands(exitCode, insertBreak),
96
+ // 'Shift-Ctrl-0': setBlockType(schema.nodes.paragraph),
97
+ // 'Shift-Ctrl-\\': setBlockType(schema.nodes.listing_element),
98
+ 'Shift-Tab': goToNextCell(-1),
99
+ 'Mod-Alt-p': insertBlock(schema.nodes.figure_element),
100
+ 'Mod-Alt-t': insertBlock(schema.nodes.table_element),
101
+ 'Mod-Alt-l': insertBlock(schema.nodes.listing_element),
102
+ 'Mod-Alt-e': insertBlock(schema.nodes.equation_element),
103
+ 'Mod-Alt-b': insertBoxElement,
104
+ 'Mod-Alt-h': insertLink,
105
+ 'Mod-Alt-f': insertInlineFootnote,
106
+ 'Mod-Alt-c': insertInlineCitation,
107
+ 'Mod-Alt-r': insertCrossReference,
108
+ 'Shift-Mod-Alt-e': insertInlineEquation,
109
+ 'Shift-Mod-e': insertInlineEquation, // PC
110
+ }
111
+
112
+ export default customKeymap
@@ -0,0 +1,221 @@
1
+ /*!
2
+ * © 2019 Atypon Systems LLC
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import {
18
+ isInGraphicalAbstractSection,
19
+ ManuscriptEditorState,
20
+ ManuscriptEditorView,
21
+ schema,
22
+ } from '@manuscripts/transform'
23
+ import { chainCommands } from 'prosemirror-commands'
24
+ import { Fragment, ResolvedPos, Slice } from 'prosemirror-model'
25
+ import { TextSelection } from 'prosemirror-state'
26
+
27
+ import {
28
+ autoComplete,
29
+ Dispatch,
30
+ isAtEndOfTextBlock,
31
+ isAtStartOfTextBlock,
32
+ isTextSelection,
33
+ } from '../commands'
34
+ import { EditorAction } from '../types'
35
+
36
+ const insertParagraph = (
37
+ dispatch: Dispatch,
38
+ state: ManuscriptEditorState,
39
+ $anchor: ResolvedPos
40
+ ) => {
41
+ const {
42
+ tr,
43
+ schema: { nodes },
44
+ } = state
45
+
46
+ const offset = $anchor.nodeAfter ? $anchor.nodeAfter.nodeSize : 0
47
+ const pos = $anchor.pos + offset + 1
48
+ const nextNode = tr.doc.resolve(pos).nodeAfter
49
+
50
+ if (
51
+ !nextNode ||
52
+ nextNode.type !== nextNode.type.schema.nodes.paragraph ||
53
+ nextNode.nodeSize > 2
54
+ ) {
55
+ tr.insert(pos, nodes.paragraph.create())
56
+ }
57
+
58
+ tr.setSelection(TextSelection.create(tr.doc, pos + 1)).scrollIntoView()
59
+
60
+ dispatch(tr)
61
+ }
62
+
63
+ const leaveTitle: EditorAction = (state, dispatch, view) => {
64
+ const { selection } = state
65
+
66
+ if (!isTextSelection(selection)) {
67
+ return false
68
+ }
69
+
70
+ const { $cursor } = selection
71
+
72
+ if (!$cursor) {
73
+ return false
74
+ }
75
+
76
+ const titleTypes = [
77
+ schema.nodes.alt_title,
78
+ schema.nodes.section_title,
79
+ schema.nodes.title,
80
+ ]
81
+
82
+ if (!titleTypes.includes($cursor.parent.type)) {
83
+ return false
84
+ }
85
+
86
+ if ($cursor.parent.type === schema.nodes.alt_title) {
87
+ return true
88
+ }
89
+
90
+ if (isInGraphicalAbstractSection($cursor)) {
91
+ return false
92
+ }
93
+
94
+ if (!isAtEndOfTextBlock(state, $cursor, view)) {
95
+ return false
96
+ }
97
+
98
+ if (dispatch) {
99
+ insertParagraph(dispatch, state, $cursor)
100
+ }
101
+
102
+ return true
103
+ }
104
+
105
+ const leaveCaption: EditorAction = (state) => {
106
+ const {
107
+ selection: { $anchor },
108
+ } = state
109
+ return (
110
+ $anchor.parent.type === $anchor.parent.type.schema.nodes.caption_title ||
111
+ $anchor.node($anchor.depth - 1)?.type ===
112
+ $anchor.parent.type.schema.nodes.caption
113
+ )
114
+ }
115
+
116
+ // ignore backspace at the start of section titles
117
+ const protectTitles: EditorAction = (
118
+ state: ManuscriptEditorState,
119
+ dispatch?: Dispatch,
120
+ view?: ManuscriptEditorView
121
+ ) => {
122
+ const { selection } = state
123
+
124
+ if (!isTextSelection(selection)) {
125
+ return false
126
+ }
127
+
128
+ const { $cursor } = selection
129
+
130
+ if (!$cursor) {
131
+ return false
132
+ }
133
+
134
+ // preventing deletion of alt_titles and subtitles with backspace
135
+ if (
136
+ ($cursor.parent.type === schema.nodes.alt_title ||
137
+ $cursor.parent.type === schema.nodes.subtitle) &&
138
+ $cursor.pos === $cursor.before() + 1
139
+ ) {
140
+ return true
141
+ }
142
+
143
+ return (
144
+ $cursor.parent.type === $cursor.parent.type.schema.nodes.section_title &&
145
+ isAtStartOfTextBlock(state, $cursor, view)
146
+ )
147
+ }
148
+
149
+ export const protectReferencesTitle = (state: ManuscriptEditorState) => {
150
+ const { selection } = state
151
+
152
+ if (!isTextSelection(selection)) {
153
+ return false
154
+ }
155
+ const { $from } = selection
156
+ const parentNode = $from.node($from.depth - 1)
157
+ return (
158
+ $from.parent.type === schema.nodes.section_title &&
159
+ parentNode.type === schema.nodes.bibliography_section
160
+ )
161
+ }
162
+
163
+ const protectCaption: EditorAction = (
164
+ state: ManuscriptEditorState,
165
+ dispatch?: Dispatch
166
+ ) => {
167
+ const {
168
+ selection: { $anchor },
169
+ } = state
170
+ let nodeType = undefined
171
+
172
+ if (
173
+ $anchor.node($anchor.depth - 1)?.type ===
174
+ $anchor.parent.type.schema.nodes.caption &&
175
+ $anchor.node($anchor.depth).content.size === 1
176
+ ) {
177
+ nodeType = $anchor.node($anchor.depth - 1).type
178
+ } else if (
179
+ $anchor.parent.type === $anchor.parent.type.schema.nodes.caption_title &&
180
+ $anchor.parent.content.size === 1
181
+ ) {
182
+ nodeType = $anchor.parent.type
183
+ }
184
+
185
+ if (dispatch && nodeType) {
186
+ const slice = new Slice(Fragment.from([nodeType.create()]), 1, 1)
187
+ const tr = state.tr.replace($anchor.pos - 1, $anchor.pos, slice)
188
+ dispatch(tr)
189
+
190
+ return true
191
+ }
192
+
193
+ return false
194
+ }
195
+
196
+ const keepCaption = (state: ManuscriptEditorState, dispatch?: Dispatch) => {
197
+ const {
198
+ selection: { $anchor },
199
+ } = state
200
+ if (
201
+ dispatch &&
202
+ $anchor.parent.type === $anchor.parent.type.schema.nodes.caption_title &&
203
+ $anchor.parent.content.size === 1
204
+ ) {
205
+ dispatch(state.tr.delete($anchor.pos, $anchor.pos + 1))
206
+ return true
207
+ }
208
+ return false
209
+ }
210
+
211
+ const titleKeymap: { [key: string]: EditorAction } = {
212
+ Backspace: chainCommands(
213
+ protectTitles,
214
+ protectReferencesTitle,
215
+ protectCaption
216
+ ),
217
+ Enter: chainCommands(autoComplete, leaveTitle, leaveCaption),
218
+ Delete: chainCommands(keepCaption, protectReferencesTitle),
219
+ }
220
+
221
+ export default titleKeymap