@manuscripts/body-editor 3.12.66 → 3.13.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.
- package/dist/cjs/components/toolbar/type-selector/styles.js +2 -1
- package/dist/cjs/versions.js +1 -1
- package/dist/es/components/toolbar/type-selector/styles.js +2 -1
- package/dist/es/versions.js +1 -1
- package/dist/types/components/toolbar/type-selector/styles.d.ts +2 -2
- package/dist/types/lib/footnotes.d.ts +4 -2
- package/dist/types/lib/utils.d.ts +5 -4
- package/dist/types/versions.d.ts +1 -1
- package/package.json +37 -36
- package/{dist/es/lib/statistics.js → src/__mocks__/styleMock.ts} +2 -14
- package/src/assets.ts +20 -0
- package/src/classes/collabProvider.ts +38 -0
- package/src/clipboard.ts +54 -0
- package/src/commands.ts +2109 -0
- package/src/components/ChangeHandlingForm.tsx +54 -0
- package/src/components/LanguageDropdown/index.tsx +343 -0
- package/src/components/affiliations/AffiliationForm.tsx +238 -0
- package/src/components/affiliations/AffiliationItem.tsx +151 -0
- package/src/components/affiliations/AffiliationList.tsx +71 -0
- package/src/components/affiliations/AffiliationsModal.tsx +676 -0
- package/src/components/affiliations/AffiliationsPanel.tsx +76 -0
- package/src/components/affiliations/CreateAffiliationModal.tsx +135 -0
- package/src/components/authors/AuthorDetailsForm.tsx +438 -0
- package/src/components/authors/AuthorList.tsx +81 -0
- package/src/components/authors/AuthorsModal.tsx +642 -0
- package/src/components/authors/AuthorsPanel.tsx +69 -0
- package/src/components/authors/CreateAuthorModal.tsx +172 -0
- package/src/components/authors/CreditDrawer.tsx +71 -0
- package/src/components/authors/DraggableAuthor.tsx +228 -0
- package/src/components/authors/useManageAffiliations.tsx +77 -0
- package/src/components/authors/useManageCredit.tsx +63 -0
- package/src/components/authors-affiliations/AuthorsAndAffiliationsModals.tsx +170 -0
- package/src/components/authors-affiliations/GenericPanel.tsx +164 -0
- package/src/components/authors-affiliations/ModalTabs.tsx +100 -0
- package/src/components/awards/AwardForm.tsx +338 -0
- package/src/components/awards/AwardModal.tsx +120 -0
- package/src/components/awards/DeleteAwardDiaolog.tsx +52 -0
- package/src/components/dialog/ConfirmationDialog.tsx +131 -0
- package/src/components/form/CreateModalStyles.tsx +37 -0
- package/src/components/form/FormFooter.tsx +54 -0
- package/src/components/form/FormPlaceholder.tsx +71 -0
- package/src/components/form/ModalFormActions.tsx +88 -0
- package/src/components/form/UnsavedLabel.tsx +49 -0
- package/src/components/hooks/use-debounce.ts +56 -0
- package/src/components/hooks/useAffiliationShowsErrorIndicator.ts +51 -0
- package/src/components/hooks/useAuthorShowsErrorIndicator.ts +73 -0
- package/src/components/keyboard-shortcuts-modal/FormattedShortcut.tsx +56 -0
- package/src/components/keyboard-shortcuts-modal/KeyboardShortcutsModal.tsx +283 -0
- package/src/components/keyboard-shortcuts-modal/keyboard-shortcuts.ts +304 -0
- package/src/components/keywords/AddKeywordInline.tsx +284 -0
- package/src/components/keywords/DeleteKeywordDialog.tsx +52 -0
- package/src/components/modal-drawer/GenericDrawer.tsx +65 -0
- package/src/components/modal-drawer/GenericDrawerGroup.tsx +125 -0
- package/src/components/outline/DraggableTree.tsx +438 -0
- package/src/components/outline/ManuscriptOutline.tsx +127 -0
- package/src/components/outline/Outline.tsx +141 -0
- package/src/components/references/BibliographyItemSource.ts +80 -0
- package/src/components/references/CitationEditor.tsx +301 -0
- package/src/components/references/CitationViewer.tsx +62 -0
- package/src/components/references/ImportBibliographyForm.tsx +232 -0
- package/src/components/references/ImportBibliographyModal.tsx +159 -0
- package/src/components/references/ReferenceForm/PersonDropDown.tsx +93 -0
- package/src/components/references/ReferenceForm/ReferenceForm.tsx +701 -0
- package/src/components/references/ReferenceForm/config.ts +133 -0
- package/src/components/references/ReferenceForm/styled-components.ts +156 -0
- package/src/components/references/ReferenceLine.tsx +43 -0
- package/src/components/references/ReferenceSearch.tsx +163 -0
- package/src/components/references/ReferenceSearchResults.tsx +113 -0
- package/src/components/references/ReferenceSearchResultsPlaceholder.tsx +71 -0
- package/src/components/references/ReferenceSearchSection.tsx +124 -0
- package/src/components/references/ReferencesEditor.tsx +61 -0
- package/src/components/references/ReferencesModal.tsx +352 -0
- package/src/components/references/SearchInput.tsx +98 -0
- package/src/components/toolbar/InsertEmbedDialog.tsx +222 -0
- package/src/components/toolbar/InsertTableDialog.tsx +208 -0
- package/src/components/toolbar/ListMenuItem.tsx +203 -0
- package/src/components/toolbar/helpers.ts +547 -0
- package/src/components/toolbar/type-selector/OptionComponent.tsx +89 -0
- package/src/components/toolbar/type-selector/TypeSelector.tsx +157 -0
- package/src/components/toolbar/type-selector/styles.ts +79 -0
- package/src/components/views/CrossReferenceItems.tsx +199 -0
- package/src/components/views/DeleteEmbedDialog.tsx +83 -0
- package/src/components/views/DeleteFootnoteDialog.tsx +54 -0
- package/src/components/views/FigureDropdown.tsx +423 -0
- package/src/components/views/FootnotesSelector.tsx +255 -0
- package/src/components/views/InsertSpecialCharacter.tsx +245 -0
- package/src/components/views/LinkForm.tsx +220 -0
- package/src/components/views/TableCellContextMenu.tsx +241 -0
- package/src/configs/ManuscriptsEditor.ts +140 -0
- package/src/configs/editor-plugins.ts +119 -0
- package/src/configs/editor-views.ts +139 -0
- package/src/icons.ts +62 -0
- package/src/index.ts +65 -0
- package/src/keys/highlight.ts +65 -0
- package/src/keys/index.ts +33 -0
- package/src/keys/keyword.ts +69 -0
- package/src/keys/list.ts +156 -0
- package/src/keys/misc.ts +112 -0
- package/src/keys/title.ts +221 -0
- package/src/lib/__tests__/__fixtures__/doc.json +388 -0
- package/src/lib/__tests__/__snapshots__/paste.test.ts.snap +24 -0
- package/src/lib/__tests__/authors.test.ts +202 -0
- package/src/lib/__tests__/helpers.test.ts +46 -0
- package/src/lib/__tests__/paste.test.ts +57 -0
- package/src/lib/__tests__/plugins.test.ts +176 -0
- package/src/lib/__tests__/url.test.ts +31 -0
- package/src/lib/array-reducer.ts +68 -0
- package/src/lib/authors-and-affiliations.ts +81 -0
- package/src/lib/authors.ts +67 -0
- package/src/lib/capabilities.ts +55 -0
- package/src/lib/codemirror.ts +37 -0
- package/src/lib/comments.ts +123 -0
- package/src/lib/context-menu.ts +745 -0
- package/src/lib/copy.ts +30 -0
- package/src/lib/crossref.ts +90 -0
- package/src/lib/dnd.ts +29 -0
- package/src/lib/doc.ts +167 -0
- package/src/lib/dompurify.ts +28 -0
- package/src/lib/files.ts +180 -0
- package/src/lib/footnotes.ts +83 -0
- package/src/lib/get-media-type.ts +105 -0
- package/src/lib/helpers.ts +199 -0
- package/src/lib/hierarchy.ts +117 -0
- package/src/lib/languages.ts +37 -0
- package/src/lib/lists.ts +56 -0
- package/src/lib/math.ts +111 -0
- package/src/lib/media.ts +334 -0
- package/src/lib/navigation-utils.ts +235 -0
- package/src/lib/normalize.ts +70 -0
- package/src/lib/paste.ts +304 -0
- package/src/lib/placeholder.ts +32 -0
- package/src/lib/platform.ts +18 -0
- package/src/lib/plugins.ts +22 -0
- package/src/lib/popper.ts +180 -0
- package/src/lib/position-menu.ts +184 -0
- package/src/lib/references.ts +94 -0
- package/src/lib/template.ts +29 -0
- package/src/lib/track-changes-utils.ts +34 -0
- package/{dist/types/lib/statistics.d.ts → src/lib/url.ts} +11 -8
- package/src/lib/use-do-with-debounce.ts +39 -0
- package/src/lib/utils.ts +323 -0
- package/src/lib/view.ts +100 -0
- package/src/menus.tsx +684 -0
- package/src/node-type-icons.tsx +83 -0
- package/src/plugins/__tests__/__fixtures__/deleted-footnote.json +140 -0
- package/src/plugins/__tests__/__fixtures__/inserted-footnote.json +153 -0
- package/src/plugins/__tests__/footnotes.test.ts +67 -0
- package/src/plugins/accessibility_element.ts +219 -0
- package/src/plugins/add-subtitle.ts +102 -0
- package/src/plugins/affiliations.ts +136 -0
- package/src/plugins/alt-titles.ts +219 -0
- package/src/plugins/bibliography.ts +235 -0
- package/src/plugins/comments.ts +328 -0
- package/src/plugins/cross-references.ts +70 -0
- package/src/plugins/detect-inconsistency/detect-inconsistency-utils.ts +102 -0
- package/src/plugins/detect-inconsistency/index.ts +55 -0
- package/src/plugins/detect-inconsistency/validators.ts +283 -0
- package/src/plugins/doi.ts +66 -0
- package/src/plugins/editor-props.ts +39 -0
- package/src/plugins/elements.ts +60 -0
- package/src/plugins/footnotes.ts +298 -0
- package/src/plugins/link.ts +53 -0
- package/src/plugins/lock-body.ts +136 -0
- package/src/plugins/move-node.ts +55 -0
- package/src/plugins/objects.ts +125 -0
- package/src/plugins/paragraphs.ts +90 -0
- package/src/plugins/persist.ts +64 -0
- package/src/plugins/persistent-cursor.ts +66 -0
- package/src/plugins/placeholder.ts +219 -0
- package/src/plugins/prevent-empty.ts +50 -0
- package/src/plugins/search-replace/index.ts +157 -0
- package/src/plugins/search-replace/lib.ts +95 -0
- package/src/plugins/section_category.ts +212 -0
- package/src/plugins/section_title/autocompletion.ts +87 -0
- package/src/plugins/section_title/index.ts +105 -0
- package/src/plugins/selected-suggestion.ts +243 -0
- package/src/plugins/tables-cursor-fix.ts +143 -0
- package/src/plugins/translations.ts +263 -0
- package/src/rules.ts +60 -0
- package/src/selection.ts +112 -0
- package/src/testing/default-capabilities.ts +48 -0
- package/src/testing/default-editor-data.ts +73 -0
- package/src/testing/empty-editor-doc.json +62 -0
- package/src/testing/polyfill-dom.ts +43 -0
- package/src/testing/section-categories.json +161 -0
- package/src/testing/setup-editor.ts +55 -0
- package/src/tests.ts +42 -0
- package/src/toolbar.tsx +259 -0
- package/src/types/@citation-js/core.d.ts +16 -0
- package/src/types/@citation-js/index.d.ts +16 -0
- package/src/types/@citation-js/plugin-bibtex.d.ts +16 -0
- package/src/types/@citation-js/plugin-csl.d.ts +16 -0
- package/src/types/@citation-js/plugin-doi.d.ts +16 -0
- package/src/types/@citation-js/plugin-enw.d.ts +16 -0
- package/src/types/@citation-js/plugin-pubmed.d.ts +16 -0
- package/src/types/@citation-js/plugin-ris.d.ts +16 -0
- package/src/types/citeproc.d.ts +124 -0
- package/src/types/css.d.ts +16 -0
- package/src/types/json.d.ts +17 -0
- package/src/types/prosemirror-dev-tools.d.ts +16 -0
- package/src/types/prosemirror-dropcursor.d.ts +16 -0
- package/src/types/styled-components.d.ts +23 -0
- package/src/types.ts +49 -0
- package/src/useEditor.ts +244 -0
- package/src/versions.ts +3 -0
- package/src/views/ReactSubView.tsx +145 -0
- package/src/views/abstracts.ts +46 -0
- package/src/views/accessibility_element.ts +86 -0
- package/src/views/affiliations.ts +254 -0
- package/src/views/alt_title.ts +85 -0
- package/src/views/alt_titles_section.ts +97 -0
- package/src/views/attachment.ts +160 -0
- package/src/views/attachments.ts +72 -0
- package/src/views/author_notes.ts +96 -0
- package/src/views/award.ts +194 -0
- package/src/views/awards.ts +59 -0
- package/src/views/base_node_view.ts +85 -0
- package/src/views/bibliography_element.ts +313 -0
- package/src/views/block_view.ts +100 -0
- package/src/views/blockquote_element.ts +26 -0
- package/src/views/blockquote_element_editable.ts +24 -0
- package/src/views/box_element.ts +33 -0
- package/src/views/caption.ts +37 -0
- package/src/views/caption_title.ts +33 -0
- package/src/views/citation.ts +67 -0
- package/src/views/citation_editable.ts +312 -0
- package/src/views/contributors.ts +341 -0
- package/src/views/creators.ts +82 -0
- package/src/views/cross_reference.ts +74 -0
- package/src/views/cross_reference_editable.ts +113 -0
- package/src/views/editable_block.ts +141 -0
- package/src/views/embed.ts +345 -0
- package/src/views/empty.ts +26 -0
- package/src/views/equation.ts +47 -0
- package/src/views/equation_editable.ts +84 -0
- package/src/views/equation_element.ts +29 -0
- package/src/views/equation_element_editable.ts +21 -0
- package/src/views/figure.ts +84 -0
- package/src/views/figure_editable.ts +361 -0
- package/src/views/figure_element.ts +197 -0
- package/src/views/figure_element_editable.ts +21 -0
- package/src/views/footnote.ts +236 -0
- package/src/views/footnotes_element.ts +54 -0
- package/src/views/general_table_footnote.ts +140 -0
- package/src/views/hero_image.ts +76 -0
- package/src/views/hero_image_editable.ts +21 -0
- package/src/views/image_element.ts +373 -0
- package/src/views/image_element_editable.ts +21 -0
- package/src/views/inline_equation.ts +47 -0
- package/src/views/inline_equation_editable.ts +70 -0
- package/src/views/inline_footnote.ts +264 -0
- package/src/views/inline_footnote_editable.ts +20 -0
- package/src/views/keyword.ts +127 -0
- package/src/views/keyword_group.ts +109 -0
- package/src/views/link.ts +27 -0
- package/src/views/link_editable.ts +169 -0
- package/src/views/list.ts +46 -0
- package/src/views/list_item.ts +26 -0
- package/src/views/paragraph.ts +26 -0
- package/src/views/paragraph_editable.ts +21 -0
- package/src/views/placeholder.ts +35 -0
- package/src/views/placeholder_element.ts +38 -0
- package/src/views/placeholder_element_editable.ts +21 -0
- package/src/views/pullquote_element.ts +106 -0
- package/src/views/pullquote_element_editable.ts +24 -0
- package/src/views/quote_image_editable.ts +84 -0
- package/src/views/section.ts +64 -0
- package/src/views/section_label.ts +20 -0
- package/src/views/section_title.ts +87 -0
- package/src/views/section_title_editable.ts +21 -0
- package/src/views/subtitle.ts +42 -0
- package/src/views/subtitle_editable.ts +20 -0
- package/src/views/subtitles.ts +34 -0
- package/src/views/subtitles_editable.ts +21 -0
- package/src/views/supplement.ts +236 -0
- package/src/views/supplement_editable.ts +20 -0
- package/src/views/supplements.ts +65 -0
- package/src/views/supplements_editable.ts +21 -0
- package/src/views/table_cell.ts +150 -0
- package/src/views/table_element.ts +33 -0
- package/src/views/table_element_editable.ts +21 -0
- package/src/views/table_element_footer.ts +41 -0
- package/src/views/title.ts +46 -0
- package/src/views/title_editable.ts +20 -0
- package/src/views/trans_graphical_abstract.ts +55 -0
- package/src/views/trans_graphical_abstract_editable.ts +21 -0
- package/src/views/translated_abstract.ts +53 -0
- package/src/views/translated_abstract_editable.ts +21 -0
- 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
|
package/src/keys/list.ts
ADDED
|
@@ -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
|
package/src/keys/misc.ts
ADDED
|
@@ -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
|