@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.
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,184 @@
1
+ /*!
2
+ * © 2025 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 { ContextMenu, ContextMenuProps } from '@manuscripts/style-guide'
18
+ import {
19
+ ManuscriptEditorView,
20
+ ManuscriptNode,
21
+ ManuscriptNodeType,
22
+ } from '@manuscripts/transform'
23
+
24
+ import { EditorProps } from '../configs/ManuscriptsEditor'
25
+ import { imageDefaultIcon, imageLeftIcon, imageRightIcon } from '../icons'
26
+ import { figurePositions } from '../views/image_element'
27
+ import ReactSubView from '../views/ReactSubView'
28
+ import { handleEnterKey } from './navigation-utils'
29
+ import { updateNodeAttrs } from './view'
30
+
31
+ export interface PopperMenuPositionOption {
32
+ label: string
33
+ action: () => void
34
+ icon: string
35
+ selected: boolean
36
+ }
37
+
38
+ export const createPositionOptions = <T extends ManuscriptNode>(
39
+ nodeType: ManuscriptNodeType,
40
+ node: T,
41
+ currentPosition: string,
42
+ view: ManuscriptEditorView,
43
+ onComplete?: () => void
44
+ ) => {
45
+ const createAction = (position: string) => () => {
46
+ onComplete?.()
47
+ updateNodeAttrs(view, nodeType, {
48
+ ...node.attrs,
49
+ type: position,
50
+ })
51
+ }
52
+
53
+ return [
54
+ {
55
+ title: 'Left',
56
+ action: createAction(figurePositions.left),
57
+ IconComponent: imageLeftIcon,
58
+ iconName: 'ImageLeft',
59
+ selected: currentPosition === figurePositions.left,
60
+ },
61
+ {
62
+ title: 'Center',
63
+ action: createAction(figurePositions.default),
64
+ IconComponent: imageDefaultIcon,
65
+ iconName: 'ImageDefault',
66
+ selected: !currentPosition,
67
+ },
68
+ {
69
+ title: 'Right',
70
+ action: createAction(figurePositions.right),
71
+ IconComponent: imageRightIcon,
72
+ iconName: 'ImageRight',
73
+ selected: currentPosition === figurePositions.right,
74
+ },
75
+ ]
76
+ }
77
+
78
+ export const createPopperMenuPositionOptions = <T extends ManuscriptNode>(
79
+ nodeType: ManuscriptNodeType,
80
+ node: T,
81
+ currentPosition: string,
82
+ view: ManuscriptEditorView,
83
+ onComplete?: () => void
84
+ ): PopperMenuPositionOption[] => {
85
+ return createPositionOptions(
86
+ nodeType,
87
+ node,
88
+ currentPosition,
89
+ view,
90
+ onComplete
91
+ ).map((option) => ({
92
+ label: option.title,
93
+ action: option.action,
94
+ icon: option.iconName,
95
+ selected: option.selected,
96
+ }))
97
+ }
98
+
99
+ export const showPositionMenu = <T extends ManuscriptNode>(
100
+ nodeType: ManuscriptNodeType,
101
+ node: T,
102
+ currentPosition: string,
103
+ positionMenuWrapper: HTMLElement,
104
+ view: ManuscriptEditorView,
105
+ getPos: () => number,
106
+ props: EditorProps
107
+ ) => {
108
+ props.popper.destroy()
109
+
110
+ const options = createPopperMenuPositionOptions(
111
+ nodeType,
112
+ node,
113
+ currentPosition,
114
+ view,
115
+ () => props.popper.destroy()
116
+ )
117
+
118
+ const componentProps: ContextMenuProps = {
119
+ actions: options,
120
+ }
121
+
122
+ props.popper.show(
123
+ positionMenuWrapper,
124
+ ReactSubView(props, ContextMenu, componentProps, node, getPos, view, [
125
+ 'context-menu',
126
+ 'position-menu',
127
+ ]),
128
+ 'left',
129
+ false
130
+ )
131
+ }
132
+
133
+ export const setElementPositionAlignment = (
134
+ element: HTMLElement,
135
+ position: string
136
+ ): void => {
137
+ switch (position) {
138
+ case figurePositions.left:
139
+ element.setAttribute('data-alignment', 'left')
140
+ break
141
+ case figurePositions.right:
142
+ element.setAttribute('data-alignment', 'right')
143
+ break
144
+ default:
145
+ element.removeAttribute('data-alignment')
146
+ break
147
+ }
148
+ }
149
+
150
+ export const createPositionMenuWrapper = (
151
+ currentPosition: string,
152
+ onClick: () => void,
153
+ props: EditorProps
154
+ ): HTMLDivElement => {
155
+ const can = props.getCapabilities()
156
+ const positionMenuWrapper = document.createElement('div')
157
+ positionMenuWrapper.classList.add('position-menu')
158
+
159
+ const positionMenuButton = document.createElement('div')
160
+ positionMenuButton.classList.add('position-menu-button')
161
+
162
+ let icon
163
+ switch (currentPosition) {
164
+ case figurePositions.left:
165
+ icon = imageLeftIcon
166
+ break
167
+ case figurePositions.right:
168
+ icon = imageRightIcon
169
+ break
170
+ default:
171
+ icon = imageDefaultIcon
172
+ break
173
+ }
174
+ if (icon) {
175
+ positionMenuButton.innerHTML = icon
176
+ }
177
+ if (can.editArticle) {
178
+ positionMenuButton.tabIndex = 0
179
+ positionMenuButton.addEventListener('click', onClick)
180
+ positionMenuButton.addEventListener('keydown', handleEnterKey(onClick))
181
+ }
182
+ positionMenuWrapper.appendChild(positionMenuButton)
183
+ return positionMenuWrapper
184
+ }
@@ -0,0 +1,94 @@
1
+ /*!
2
+ * © 2024 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 { Cite } from '@citation-js/core'
17
+ import {
18
+ BibliographyItemAttrs,
19
+ BibliographyItemType,
20
+ } from '@manuscripts/transform'
21
+
22
+ export const metadata = (item: BibliographyItemAttrs): string => {
23
+ return [authors(item), item['container-title'], issuedYear(item)]
24
+ .filter(Boolean)
25
+ .join(', ')
26
+ }
27
+
28
+ export const issuedYear = (item: BibliographyItemAttrs): string => {
29
+ if (
30
+ !item.issued ||
31
+ !item.issued['date-parts'] ||
32
+ !item.issued['date-parts'][0] ||
33
+ !item.issued['date-parts'][0][0]
34
+ ) {
35
+ return ''
36
+ }
37
+
38
+ const [[year]] = item.issued['date-parts']
39
+
40
+ return `${year}`
41
+ }
42
+
43
+ export const authors = (item: BibliographyItemAttrs): string => {
44
+ if (!item.author) {
45
+ return ''
46
+ }
47
+ const authors = item.author
48
+ .map((a) => a.family || a.literal || a.given)
49
+ .filter(Boolean)
50
+
51
+ if (authors.length > 1) {
52
+ const last = authors.splice(-2)
53
+ authors.push(last.join(' & '))
54
+ }
55
+
56
+ return authors.join(', ')
57
+ }
58
+
59
+ const loadCitationJsPlugins = async () => {
60
+ try {
61
+ await Promise.all([
62
+ import('@citation-js/plugin-bibtex'),
63
+ import('@citation-js/plugin-ris'),
64
+ import('@citation-js/plugin-doi'),
65
+ import('@citation-js/plugin-csl'),
66
+ import('@citation-js/plugin-pubmed'),
67
+ import('@citation-js/plugin-enw'),
68
+ ])
69
+ } catch (error) {
70
+ console.error('Failed to load citation plugins:', error)
71
+ }
72
+ }
73
+
74
+ export const importBibliographyItems = async (
75
+ data: string
76
+ ): Promise<BibliographyItemAttrs[]> => {
77
+ await loadCitationJsPlugins()
78
+ const cite = await Cite.async(data.trim())
79
+ return cite.data
80
+ }
81
+
82
+ export const bibliographyItemTypes: [BibliographyItemType, string][] = [
83
+ ['article-journal', 'Journal Article'],
84
+ ['book', 'Book'],
85
+ ['chapter', 'Chapter'],
86
+ ['confproc', 'Conference Paper'],
87
+ ['thesis', 'Thesis'],
88
+ ['webpage', 'Web Page'],
89
+ ['other', 'Other'],
90
+ ['standard', 'Standard'],
91
+ ['dataset', 'Dataset'],
92
+ ['preprint', 'Preprint'],
93
+ ['literal', 'Unstructured'],
94
+ ]
@@ -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 { ManuscriptNodeType } from '@manuscripts/transform'
18
+ import { EditorState } from 'prosemirror-state'
19
+
20
+ import { getEditorProps } from '../plugins/editor-props'
21
+
22
+ export const templateAllows = (
23
+ state: EditorState,
24
+ nodeType: ManuscriptNodeType
25
+ ) => {
26
+ const props = getEditorProps(state)
27
+ const hiddenNodeTypes = props?.hiddenNodeTypes
28
+ return !hiddenNodeTypes?.length || !hiddenNodeTypes.includes(nodeType)
29
+ }
@@ -0,0 +1,34 @@
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 { EditAttrsTrackingIcon } from '@manuscripts/style-guide'
18
+ import { isDeleted } from '@manuscripts/track-changes-plugin'
19
+ import { Node as ProsemirrorNode } from 'prosemirror-model'
20
+ import { createElement } from 'react'
21
+ import { renderToStaticMarkup } from 'react-dom/server'
22
+
23
+ export function isHidden(node: ProsemirrorNode) {
24
+ return isDeleted(node)
25
+ }
26
+
27
+ export const getAttrsTrackingButton = (changeID: string) => {
28
+ const el = document.createElement('button')
29
+ el.className = 'attrs-popper-button'
30
+ el.value = changeID
31
+ el.innerHTML = renderToStaticMarkup(createElement(EditAttrsTrackingIcon))
32
+
33
+ return el
34
+ }
@@ -13,12 +13,15 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { ManuscriptNode } from '@manuscripts/transform';
17
- export declare const buildText: (node: ManuscriptNode) => string;
18
- export declare const countWords: (text: string) => number;
19
- export declare const countCharacters: (text: string) => number;
20
- export interface NodeStatistics {
21
- text: string;
22
- words: number;
23
- characters: number;
16
+
17
+ const allowedHrefProtocols = ['http:', 'https:', 'ftp:']
18
+
19
+ export const allowedHref = (href: string): boolean => {
20
+ try {
21
+ const url = new URL(href)
22
+
23
+ return allowedHrefProtocols.includes(url.protocol)
24
+ } catch {
25
+ return false
26
+ }
24
27
  }
@@ -0,0 +1,39 @@
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 { useRef } from 'react'
17
+
18
+ export const useDoWithDebounce = () => {
19
+ const debounced = useRef<() => void>(() => undefined)
20
+ const timeout = useRef<number>(undefined)
21
+
22
+ const doWithDebounce = (fn: () => void, interval = 1000, flush = false) => {
23
+ debounced.current = fn
24
+
25
+ if (flush) {
26
+ fn()
27
+ debounced.current = () => undefined
28
+ window.clearTimeout(timeout.current)
29
+ }
30
+
31
+ window.clearTimeout(timeout.current)
32
+ timeout.current = window.setTimeout(() => {
33
+ debounced.current()
34
+ timeout.current = 0
35
+ }, interval)
36
+ }
37
+
38
+ return doWithDebounce
39
+ }