@manuscripts/body-editor 3.12.67 → 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,345 @@
|
|
|
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
|
+
import { EmbedNode } from '@manuscripts/transform'
|
|
17
|
+
import { isEqual } from 'lodash'
|
|
18
|
+
import { NodeSelection } from 'prosemirror-state'
|
|
19
|
+
|
|
20
|
+
import {
|
|
21
|
+
NoPreviewMessageWithLink,
|
|
22
|
+
openEmbedDialog,
|
|
23
|
+
} from '../components/toolbar/InsertEmbedDialog'
|
|
24
|
+
import { getMediaTypeInfo } from '../lib/get-media-type'
|
|
25
|
+
import {
|
|
26
|
+
addInteractionHandlers,
|
|
27
|
+
createFileHandlers,
|
|
28
|
+
createFileUploader,
|
|
29
|
+
createMediaPlaceholder,
|
|
30
|
+
createReactTools,
|
|
31
|
+
createUnsupportedFormat,
|
|
32
|
+
FileHandlers,
|
|
33
|
+
MediaType,
|
|
34
|
+
} from '../lib/media'
|
|
35
|
+
import { allowedHref } from '../lib/url'
|
|
36
|
+
import { Trackable } from '../types'
|
|
37
|
+
import BlockView from './block_view'
|
|
38
|
+
import { createEditableNodeView } from './creators'
|
|
39
|
+
import { EditableBlock } from './editable_block'
|
|
40
|
+
import ReactSubView from './ReactSubView'
|
|
41
|
+
|
|
42
|
+
export class EmbedView extends BlockView<Trackable<EmbedNode>> {
|
|
43
|
+
private container: HTMLElement
|
|
44
|
+
private figureBlock: HTMLElement
|
|
45
|
+
private preview: HTMLElement | null = null
|
|
46
|
+
public reactTools: HTMLDivElement | null = null
|
|
47
|
+
public ignoreMutation = () => true
|
|
48
|
+
private initialized = false
|
|
49
|
+
private previousAttrs: {
|
|
50
|
+
href?: string
|
|
51
|
+
mimetype?: string
|
|
52
|
+
mimeSubtype?: string
|
|
53
|
+
} = {}
|
|
54
|
+
|
|
55
|
+
public createElement = () => {
|
|
56
|
+
this.container = document.createElement('div')
|
|
57
|
+
this.container.classList.add('block')
|
|
58
|
+
this.dom.appendChild(this.container)
|
|
59
|
+
const figureBlock = document.createElement('div')
|
|
60
|
+
figureBlock.classList.add('figure-block')
|
|
61
|
+
this.container.appendChild(figureBlock)
|
|
62
|
+
|
|
63
|
+
this.contentDOM = document.createElement('div')
|
|
64
|
+
figureBlock.appendChild(this.contentDOM)
|
|
65
|
+
|
|
66
|
+
this.figureBlock = figureBlock
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
upload = async (file: File) => {
|
|
70
|
+
const mediaInfo = getMediaTypeInfo(file)
|
|
71
|
+
|
|
72
|
+
const result = await this.props.fileManagement.upload(file)
|
|
73
|
+
|
|
74
|
+
const pos = this.getPos()
|
|
75
|
+
const tr = this.view.state.tr
|
|
76
|
+
tr.setNodeMarkup(pos, undefined, {
|
|
77
|
+
...this.node.attrs,
|
|
78
|
+
href: result.id,
|
|
79
|
+
mimetype: mediaInfo.mimetype,
|
|
80
|
+
mimeSubtype: mediaInfo.mimeSubtype,
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
this.view.dispatch(tr)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
public updateContents() {
|
|
87
|
+
super.updateContents()
|
|
88
|
+
const { href, mimetype, mimeSubtype } = this.node.attrs
|
|
89
|
+
|
|
90
|
+
const currentAttrs = { href, mimetype, mimeSubtype }
|
|
91
|
+
const contentChanged =
|
|
92
|
+
!this.initialized || !isEqual(this.previousAttrs, currentAttrs)
|
|
93
|
+
|
|
94
|
+
if (contentChanged) {
|
|
95
|
+
this.initialized = true
|
|
96
|
+
this.previousAttrs = currentAttrs
|
|
97
|
+
this.updateMediaPreview()
|
|
98
|
+
this.manageReactTools()
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
private manageReactTools() {
|
|
103
|
+
this.reactTools?.remove()
|
|
104
|
+
|
|
105
|
+
let handlers: FileHandlers | undefined
|
|
106
|
+
const can = this.props.getCapabilities()
|
|
107
|
+
|
|
108
|
+
if (this.isUploadedFile()) {
|
|
109
|
+
handlers = createFileHandlers(
|
|
110
|
+
this.node.attrs,
|
|
111
|
+
'href',
|
|
112
|
+
this.view,
|
|
113
|
+
this.props,
|
|
114
|
+
this.setHref
|
|
115
|
+
)
|
|
116
|
+
if (can.uploadFile) {
|
|
117
|
+
handlers.handleUpload = createFileUploader(
|
|
118
|
+
this.upload,
|
|
119
|
+
'video/*,audio/*'
|
|
120
|
+
)
|
|
121
|
+
}
|
|
122
|
+
} else if (this.isEmbedLink()) {
|
|
123
|
+
handlers = this.createEmbedHandlers()
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (handlers) {
|
|
127
|
+
this.reactTools = createReactTools(
|
|
128
|
+
this.node,
|
|
129
|
+
this.view,
|
|
130
|
+
this.getPos,
|
|
131
|
+
this.props,
|
|
132
|
+
handlers,
|
|
133
|
+
true,
|
|
134
|
+
() => false
|
|
135
|
+
)
|
|
136
|
+
if (this.reactTools) {
|
|
137
|
+
if (this.preview) {
|
|
138
|
+
this.preview.insertBefore(this.reactTools, this.preview.firstChild)
|
|
139
|
+
} else {
|
|
140
|
+
this.dom.insertBefore(this.reactTools, this.dom.firstChild)
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
protected setHref = (href: string) => {
|
|
147
|
+
const { tr } = this.view.state
|
|
148
|
+
const pos = this.getPos()
|
|
149
|
+
tr.setNodeMarkup(pos, undefined, {
|
|
150
|
+
...this.node.attrs,
|
|
151
|
+
href: href,
|
|
152
|
+
})
|
|
153
|
+
tr.setSelection(NodeSelection.create(tr.doc, pos))
|
|
154
|
+
this.view.dispatch(tr)
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
private isUploadedFile(): boolean {
|
|
158
|
+
const { href } = this.node.attrs
|
|
159
|
+
if (!href) {
|
|
160
|
+
return false
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const files = this.props.getFiles()
|
|
164
|
+
return files.some((file) => file.id === href)
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
private isEmbedLink(): boolean {
|
|
168
|
+
const { href } = this.node.attrs
|
|
169
|
+
return !!(href && allowedHref(href) && !this.isUploadedFile())
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
private async updateMediaPreview() {
|
|
173
|
+
const preview = document.createElement('div')
|
|
174
|
+
preview.classList.add('media-preview')
|
|
175
|
+
preview.setAttribute('contenteditable', 'false')
|
|
176
|
+
|
|
177
|
+
const oldPreview = this.preview
|
|
178
|
+
? this.preview
|
|
179
|
+
: this.figureBlock.querySelector('.media-preview')
|
|
180
|
+
if (oldPreview) {
|
|
181
|
+
this.figureBlock.replaceChild(preview, oldPreview)
|
|
182
|
+
} else {
|
|
183
|
+
this.figureBlock.prepend(preview)
|
|
184
|
+
}
|
|
185
|
+
this.preview = preview
|
|
186
|
+
|
|
187
|
+
const href = this.node.attrs.href
|
|
188
|
+
|
|
189
|
+
let object: HTMLElement
|
|
190
|
+
|
|
191
|
+
if (!href) {
|
|
192
|
+
object = createMediaPlaceholder(
|
|
193
|
+
MediaType.Media,
|
|
194
|
+
this.view,
|
|
195
|
+
this.getPos,
|
|
196
|
+
this.props
|
|
197
|
+
)
|
|
198
|
+
} else if (this.isUploadedFile()) {
|
|
199
|
+
const files = this.props.getFiles()
|
|
200
|
+
const file = files.find((f) => f.id === href)
|
|
201
|
+
|
|
202
|
+
if (file) {
|
|
203
|
+
const mediaInfo = getMediaTypeInfo(file.name)
|
|
204
|
+
const isValidMediaFile = mediaInfo.isAudio || mediaInfo.isVideo
|
|
205
|
+
object = isValidMediaFile
|
|
206
|
+
? this.createMedia() ||
|
|
207
|
+
createUnsupportedFormat(
|
|
208
|
+
file.name,
|
|
209
|
+
this.props.getCapabilities().editArticle
|
|
210
|
+
)
|
|
211
|
+
: createUnsupportedFormat(
|
|
212
|
+
file.name,
|
|
213
|
+
this.props.getCapabilities().editArticle
|
|
214
|
+
)
|
|
215
|
+
} else {
|
|
216
|
+
object = createMediaPlaceholder(
|
|
217
|
+
MediaType.Media,
|
|
218
|
+
this.view,
|
|
219
|
+
this.getPos,
|
|
220
|
+
this.props
|
|
221
|
+
)
|
|
222
|
+
}
|
|
223
|
+
} else if (this.isEmbedLink()) {
|
|
224
|
+
object = await this.createEmbedPreview()
|
|
225
|
+
} else {
|
|
226
|
+
object = createMediaPlaceholder(
|
|
227
|
+
MediaType.Media,
|
|
228
|
+
this.view,
|
|
229
|
+
this.getPos,
|
|
230
|
+
this.props
|
|
231
|
+
)
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
const can = this.props.getCapabilities()
|
|
235
|
+
if (can.uploadFile && object.classList.contains('placeholder')) {
|
|
236
|
+
addInteractionHandlers(object, this.upload, 'video/*,audio/*')
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
preview.appendChild(object)
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
private createEmbedHandlers(): FileHandlers {
|
|
243
|
+
const handlers: FileHandlers = {}
|
|
244
|
+
|
|
245
|
+
handlers.handleReplaceEmbed = () => {
|
|
246
|
+
openEmbedDialog(this.view, this.getPos())
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
return handlers
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
private async createEmbedPreview(): Promise<HTMLElement> {
|
|
253
|
+
const container = document.createElement('div')
|
|
254
|
+
container.classList.add('embed-preview')
|
|
255
|
+
|
|
256
|
+
try {
|
|
257
|
+
const html = await this.props.fetchOEmbedHtml(
|
|
258
|
+
this.node.attrs.href,
|
|
259
|
+
643,
|
|
260
|
+
363
|
|
261
|
+
)
|
|
262
|
+
if (html) {
|
|
263
|
+
container.innerHTML = html
|
|
264
|
+
} else {
|
|
265
|
+
this.showUnavailableMessage(container)
|
|
266
|
+
}
|
|
267
|
+
} catch (error) {
|
|
268
|
+
this.showUnavailableMessage(container)
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
return container
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
private showUnavailableMessage(container: HTMLElement) {
|
|
275
|
+
container.appendChild(
|
|
276
|
+
ReactSubView(
|
|
277
|
+
this.props,
|
|
278
|
+
NoPreviewMessageWithLink,
|
|
279
|
+
{ href: this.node.attrs.href },
|
|
280
|
+
this.node,
|
|
281
|
+
this.getPos,
|
|
282
|
+
this.view
|
|
283
|
+
)
|
|
284
|
+
)
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
public createMedia = () => {
|
|
288
|
+
const { href } = this.node.attrs
|
|
289
|
+
if (!href) {
|
|
290
|
+
return null
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
const files = this.props.getFiles()
|
|
294
|
+
const file = files.find((f) => f.id === href)
|
|
295
|
+
if (!file) {
|
|
296
|
+
return null
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
const mediaUrl = file.link || file.id
|
|
300
|
+
|
|
301
|
+
if (!mediaUrl) {
|
|
302
|
+
return null
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
const mediaInfo = getMediaTypeInfo(file.name)
|
|
306
|
+
|
|
307
|
+
if (mediaInfo.isVideo) {
|
|
308
|
+
const video = document.createElement('video')
|
|
309
|
+
video.controls = true
|
|
310
|
+
video.style.maxWidth = '100%'
|
|
311
|
+
video.style.height = '250px'
|
|
312
|
+
|
|
313
|
+
const source = document.createElement('source')
|
|
314
|
+
source.src = mediaUrl
|
|
315
|
+
|
|
316
|
+
video.appendChild(source)
|
|
317
|
+
video.appendChild(
|
|
318
|
+
document.createTextNode('Your browser does not support the video tag.')
|
|
319
|
+
)
|
|
320
|
+
|
|
321
|
+
return video
|
|
322
|
+
} else if (mediaInfo.isAudio) {
|
|
323
|
+
const audio = document.createElement('audio')
|
|
324
|
+
audio.controls = true
|
|
325
|
+
audio.style.width = '100%'
|
|
326
|
+
|
|
327
|
+
const source = document.createElement('source')
|
|
328
|
+
source.src = mediaUrl
|
|
329
|
+
|
|
330
|
+
audio.appendChild(source)
|
|
331
|
+
audio.appendChild(
|
|
332
|
+
document.createTextNode('Your browser does not support the audio tag.')
|
|
333
|
+
)
|
|
334
|
+
|
|
335
|
+
return audio
|
|
336
|
+
} else {
|
|
337
|
+
return createUnsupportedFormat(
|
|
338
|
+
file.name,
|
|
339
|
+
this.props.getCapabilities().editArticle
|
|
340
|
+
)
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
export default createEditableNodeView(EditableBlock(EmbedView))
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* © 2023 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
|
+
/**
|
|
18
|
+
* empty section that represents prosemirror meta node
|
|
19
|
+
*/
|
|
20
|
+
export default (type: string) => () => {
|
|
21
|
+
const dom = document.createElement('div')
|
|
22
|
+
dom.setAttribute('data-type', type)
|
|
23
|
+
dom.setAttribute('contenteditable', 'false')
|
|
24
|
+
dom.style.display = 'inline'
|
|
25
|
+
return { dom }
|
|
26
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
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 { EquationNode, ManuscriptNodeView } from '@manuscripts/transform'
|
|
18
|
+
|
|
19
|
+
import { renderMath } from '../lib/math'
|
|
20
|
+
import { Trackable } from '../types'
|
|
21
|
+
import { BaseNodeView } from './base_node_view'
|
|
22
|
+
import { createNodeView } from './creators'
|
|
23
|
+
|
|
24
|
+
export class EquationView
|
|
25
|
+
extends BaseNodeView<Trackable<EquationNode>>
|
|
26
|
+
implements ManuscriptNodeView
|
|
27
|
+
{
|
|
28
|
+
public initialise = () => {
|
|
29
|
+
this.createDOM()
|
|
30
|
+
this.updateContents()
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public createDOM = () => {
|
|
34
|
+
this.dom = document.createElement('div')
|
|
35
|
+
this.dom.classList.add('equation')
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public updateContents() {
|
|
39
|
+
super.updateContents()
|
|
40
|
+
this.dom.innerHTML = this.node.attrs.contents
|
|
41
|
+
renderMath(this.dom)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public ignoreMutation = () => true
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export default createNodeView(EquationView)
|
|
@@ -0,0 +1,84 @@
|
|
|
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 { NodeSelection } from 'prosemirror-state'
|
|
18
|
+
|
|
19
|
+
import { createEditableNodeView } from './creators'
|
|
20
|
+
import { EquationView } from './equation'
|
|
21
|
+
|
|
22
|
+
export class EquationEditableView extends EquationView {
|
|
23
|
+
public selectNode = async () => {
|
|
24
|
+
if (!this.props.getCapabilities().editArticle) {
|
|
25
|
+
return
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const { createEditor } = await import('../lib/codemirror')
|
|
29
|
+
|
|
30
|
+
const placeholder = 'Enter LaTeX equation, e.g. "a^2 = \\sqrt{b^2 + c^2}"'
|
|
31
|
+
|
|
32
|
+
const input = await createEditor({
|
|
33
|
+
value: this.node.attrs.contents || '',
|
|
34
|
+
mode: 'stex',
|
|
35
|
+
placeholder,
|
|
36
|
+
autofocus: true,
|
|
37
|
+
extraKeys: {
|
|
38
|
+
Esc: () => {
|
|
39
|
+
this.props.popper.destroy()
|
|
40
|
+
this.view.focus()
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
input.on('changes', async () => {
|
|
46
|
+
const contents = input.getValue()
|
|
47
|
+
|
|
48
|
+
const pos = this.getPos()
|
|
49
|
+
|
|
50
|
+
const { tr } = this.view.state
|
|
51
|
+
|
|
52
|
+
const format = contents.includes('mml:math') ? 'mathml' : 'tex'
|
|
53
|
+
tr.setNodeMarkup(pos, undefined, {
|
|
54
|
+
...this.node.attrs,
|
|
55
|
+
contents,
|
|
56
|
+
format,
|
|
57
|
+
}).setSelection(NodeSelection.create(tr.doc, pos))
|
|
58
|
+
|
|
59
|
+
this.view.dispatch(tr)
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
const wrapper = document.createElement('div')
|
|
63
|
+
wrapper.appendChild(input.getWrapperElement())
|
|
64
|
+
wrapper.className = 'equation-editor'
|
|
65
|
+
|
|
66
|
+
const infoLink = document.createElement('a')
|
|
67
|
+
infoLink.target = '_blank'
|
|
68
|
+
infoLink.textContent = '?'
|
|
69
|
+
infoLink.title = ''
|
|
70
|
+
infoLink.href = 'https://en.wikibooks.org/wiki/LaTeX/Mathematics#Symbols'
|
|
71
|
+
infoLink.className = 'equation-editor-info'
|
|
72
|
+
|
|
73
|
+
wrapper.appendChild(infoLink)
|
|
74
|
+
|
|
75
|
+
this.props.popper.show(this.dom, wrapper, 'bottom')
|
|
76
|
+
|
|
77
|
+
window.requestAnimationFrame(() => {
|
|
78
|
+
input.refresh()
|
|
79
|
+
input.focus()
|
|
80
|
+
})
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export default createEditableNodeView(EquationEditableView)
|
|
@@ -0,0 +1,29 @@
|
|
|
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 { EquationElementNode } from '@manuscripts/transform'
|
|
18
|
+
|
|
19
|
+
import { Trackable } from '../types'
|
|
20
|
+
import BlockView from './block_view'
|
|
21
|
+
import { createNodeView } from './creators'
|
|
22
|
+
|
|
23
|
+
export class EquationElementView extends BlockView<
|
|
24
|
+
Trackable<EquationElementNode>
|
|
25
|
+
> {
|
|
26
|
+
public elementType = 'figure'
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export default createNodeView(EquationElementView)
|
|
@@ -0,0 +1,21 @@
|
|
|
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 { createEditableNodeView } from './creators'
|
|
18
|
+
import { EditableBlock } from './editable_block'
|
|
19
|
+
import { EquationElementView } from './equation_element'
|
|
20
|
+
|
|
21
|
+
export default createEditableNodeView(EditableBlock(EquationElementView))
|
|
@@ -0,0 +1,84 @@
|
|
|
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 { FigureNode, ManuscriptNodeView } from '@manuscripts/transform'
|
|
18
|
+
|
|
19
|
+
import { Trackable } from '../types'
|
|
20
|
+
import { BaseNodeView } from './base_node_view'
|
|
21
|
+
import { createNodeView } from './creators'
|
|
22
|
+
|
|
23
|
+
export class FigureView
|
|
24
|
+
extends BaseNodeView<Trackable<FigureNode>>
|
|
25
|
+
implements ManuscriptNodeView
|
|
26
|
+
{
|
|
27
|
+
protected container: HTMLElement
|
|
28
|
+
|
|
29
|
+
public initialise() {
|
|
30
|
+
this.createDOM()
|
|
31
|
+
this.updateContents()
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public ignoreMutation = () => true
|
|
35
|
+
|
|
36
|
+
public updateContents() {
|
|
37
|
+
super.updateContents()
|
|
38
|
+
while (this.container.hasChildNodes()) {
|
|
39
|
+
this.container.removeChild(this.container.firstChild as Node)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const object = this.createFigureImage() || this.createFigurePlaceholder()
|
|
43
|
+
|
|
44
|
+
this.container.appendChild(object)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public createFigureImage = () => {
|
|
48
|
+
const { src } = this.node.attrs
|
|
49
|
+
|
|
50
|
+
if (src) {
|
|
51
|
+
const element = document.createElement('img')
|
|
52
|
+
element.classList.add('figure-image')
|
|
53
|
+
element.src = src
|
|
54
|
+
return element
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
public createFigurePlaceholder = () => {
|
|
59
|
+
const element = document.createElement('div')
|
|
60
|
+
element.classList.add('figure')
|
|
61
|
+
element.classList.add('placeholder')
|
|
62
|
+
|
|
63
|
+
const instructions = document.createElement('div')
|
|
64
|
+
instructions.textContent = 'No image here yet…'
|
|
65
|
+
element.appendChild(instructions)
|
|
66
|
+
|
|
67
|
+
return element
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
protected createDOM() {
|
|
71
|
+
this.dom = document.createElement('figure')
|
|
72
|
+
|
|
73
|
+
this.container = document.createElement('div')
|
|
74
|
+
this.container.className = 'figure'
|
|
75
|
+
this.container.contentEditable = 'false'
|
|
76
|
+
this.dom.appendChild(this.container)
|
|
77
|
+
|
|
78
|
+
this.contentDOM = document.createElement('div')
|
|
79
|
+
this.contentDOM.setAttribute('tabindex', '1337') // allow focus in this node
|
|
80
|
+
this.dom.appendChild(this.contentDOM)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export default createNodeView(FigureView)
|