@modusoperandi/licit 1.0.4 → 1.0.7

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 (360) hide show
  1. package/BlockquoteInsertNewLineCommand.js +16 -18
  2. package/BlockquoteInsertNewLineCommand.js.flow +76 -77
  3. package/BlockquoteNodeSpec.js +3 -4
  4. package/BlockquoteNodeSpec.js.flow +29 -30
  5. package/BlockquoteToggleCommand.js +16 -17
  6. package/BlockquoteToggleCommand.js.flow +56 -56
  7. package/BookmarkNodeSpec.js +2 -2
  8. package/BookmarkNodeSpec.js.flow +39 -39
  9. package/BulletListNodeSpec.js.flow +61 -61
  10. package/CZIProseMirror.js.flow +90 -90
  11. package/CodeBlockCommand.js +17 -18
  12. package/CodeBlockCommand.js.flow +65 -65
  13. package/CodeBlockNodeSpec.js.flow +24 -24
  14. package/CodeMarkSpec.js.flow +14 -14
  15. package/ContentPlaceholderPlugin.js +20 -21
  16. package/ContentPlaceholderPlugin.js.flow +185 -187
  17. package/CursorPlaceholderPlugin.js +11 -11
  18. package/CursorPlaceholderPlugin.js.flow +115 -115
  19. package/DocLayoutCommand.js +18 -21
  20. package/DocLayoutCommand.js.flow +97 -99
  21. package/DocNodeSpec.js.flow +64 -64
  22. package/EMMarkSpec.js.flow +14 -14
  23. package/EditorCommands.js.flow +126 -126
  24. package/EditorKeyMap.js +0 -1
  25. package/EditorKeyMap.js.flow +185 -187
  26. package/EditorMarks.js +2 -2
  27. package/EditorMarks.js.flow +71 -71
  28. package/EditorNodes.js +2 -3
  29. package/EditorNodes.js.flow +58 -59
  30. package/EditorPageLayoutPlugin.js +10 -10
  31. package/EditorPageLayoutPlugin.js.flow +67 -67
  32. package/EditorPlugins.js.flow +8 -8
  33. package/EditorSchema.js.flow +12 -12
  34. package/EditorState.js.flow +7 -7
  35. package/FontSizeMarkSpec.js.flow +49 -49
  36. package/FontTypeMarkSpec.js +1 -1
  37. package/FontTypeMarkSpec.js.flow +80 -80
  38. package/HTMLMutator.js +6 -7
  39. package/HTMLMutator.js.flow +59 -59
  40. package/HardBreakNodeSpec.js.flow +15 -15
  41. package/HeadingNodeSpec.js +3 -13
  42. package/HeadingNodeSpec.js.flow +42 -52
  43. package/HistoryRedoCommand.js +15 -16
  44. package/HistoryRedoCommand.js.flow +41 -41
  45. package/HistoryUndoCommand.js +15 -16
  46. package/HistoryUndoCommand.js.flow +41 -41
  47. package/HorizontalRuleCommand.js +15 -16
  48. package/HorizontalRuleCommand.js.flow +71 -71
  49. package/HorizontalRuleNodeSpec.js.flow +39 -39
  50. package/ImageUploadPlaceholderPlugin.js +15 -17
  51. package/ImageUploadPlaceholderPlugin.js.flow +190 -192
  52. package/LinkMarkSpec.js +6 -1
  53. package/LinkMarkSpec.js.flow +37 -32
  54. package/LinkSetURLCommand.js +130 -60
  55. package/LinkSetURLCommand.js.flow +141 -117
  56. package/LinkTooltipPlugin.js +122 -34
  57. package/LinkTooltipPlugin.js.flow +261 -190
  58. package/ListItemInsertNewLineCommand.js +16 -18
  59. package/ListItemInsertNewLineCommand.js.flow +76 -77
  60. package/ListItemMergeCommand.js +24 -24
  61. package/ListItemMergeCommand.js.flow +198 -199
  62. package/ListItemNodeSpec.js.flow +52 -52
  63. package/ListSplitCommand.js +15 -16
  64. package/ListSplitCommand.js.flow +54 -54
  65. package/ListToggleCommand.js +19 -20
  66. package/ListToggleCommand.js.flow +99 -99
  67. package/MarkNames.js.flow +18 -18
  68. package/MarksClearCommand.js +17 -18
  69. package/MarksClearCommand.js.flow +65 -65
  70. package/MathEditCommand.js +17 -19
  71. package/MathEditCommand.js.flow +119 -120
  72. package/MathNodeSpec.js.flow +46 -46
  73. package/NodeNames.js.flow +23 -23
  74. package/OrderedListNodeSpec.js +2 -2
  75. package/OrderedListNodeSpec.js.flow +132 -132
  76. package/ParagraphNodeSpec.js +11 -2
  77. package/ParagraphNodeSpec.js.flow +163 -156
  78. package/ParagraphSpacingCommand.js +21 -23
  79. package/ParagraphSpacingCommand.js.flow +139 -144
  80. package/PrintCommand.js +17 -18
  81. package/PrintCommand.js.flow +53 -53
  82. package/SelectionPlaceholderPlugin.js +11 -11
  83. package/SelectionPlaceholderPlugin.js.flow +131 -131
  84. package/SpacerMarkSpec.js +2 -2
  85. package/SpacerMarkSpec.js.flow +47 -47
  86. package/StrikeMarkSpec.js.flow +21 -21
  87. package/StrongMarkSpec.js.flow +25 -25
  88. package/StyleView.js +5 -7
  89. package/StyleView.js.flow +18 -19
  90. package/TableBackgroundColorCommand.js +34 -23
  91. package/TableBackgroundColorCommand.js.flow +80 -75
  92. package/TableBorderColorCommand.js +34 -23
  93. package/TableBorderColorCommand.js.flow +81 -75
  94. package/TableCellColorCommand.js +20 -21
  95. package/TableCellColorCommand.js.flow +74 -75
  96. package/TableCellMenuPlugin.js +19 -19
  97. package/TableCellMenuPlugin.js.flow +130 -132
  98. package/TableInsertCommand.js +19 -22
  99. package/TableInsertCommand.js.flow +118 -120
  100. package/TableMergeCellsCommand.js +19 -19
  101. package/TableMergeCellsCommand.js.flow +113 -112
  102. package/TableNodesSpecs.js +4 -2
  103. package/TableNodesSpecs.js.flow +80 -78
  104. package/TablePlugins.js.flow +14 -14
  105. package/TableResizePlugin.js +20 -20
  106. package/TableResizePlugin.js.flow +631 -631
  107. package/TextColorMarkSpec.js.flow +35 -35
  108. package/TextHighlightMarkSpec.js.flow +38 -38
  109. package/TextInsertTabSpaceCommand.js +15 -16
  110. package/TextInsertTabSpaceCommand.js.flow +106 -106
  111. package/TextNoWrapMarkSpec.js.flow +14 -14
  112. package/TextNodeSpec.js.flow +7 -7
  113. package/TextSelectionMarkSpec.js.flow +24 -24
  114. package/TextSubMarkSpec.js.flow +20 -20
  115. package/TextSuperMarkSpec.js.flow +20 -20
  116. package/TextUnderlineMarkSpec.js.flow +27 -27
  117. package/Types.js +6 -0
  118. package/Types.js.flow +77 -75
  119. package/WebFontLoader.js +6 -7
  120. package/WebFontLoader.js.flow +22 -22
  121. package/blockQuoteInputRule.js.flow +36 -36
  122. package/bom.xml +17223 -25722
  123. package/browser.js.flow +7 -7
  124. package/buildEditorPlugins.js +6 -7
  125. package/buildEditorPlugins.js.flow +49 -49
  126. package/buildInputRules.js +8 -4
  127. package/buildInputRules.js.flow +85 -81
  128. package/client/CollabConnector.js +20 -20
  129. package/client/CollabConnector.js.flow +90 -90
  130. package/client/EditorConnection.js +10 -9
  131. package/client/EditorConnection.js.flow +324 -323
  132. package/client/Licit.js +78 -115
  133. package/client/Licit.js.flow +611 -643
  134. package/client/Licit.test.js +49 -39
  135. package/client/Licit.test.js.flow +104 -98
  136. package/client/Reporter.js +5 -6
  137. package/client/Reporter.js.flow +37 -37
  138. package/client/SimpleConnector.js +5 -5
  139. package/client/SimpleConnector.js.flow +61 -61
  140. package/client/http.js +0 -6
  141. package/client/http.js.flow +62 -70
  142. package/client/licit.css +12 -12
  143. package/client/throttle.js +8 -2
  144. package/client/throttle.js.flow +27 -27
  145. package/convertFromDOMElement.js +2 -4
  146. package/convertFromDOMElement.js.flow +33 -36
  147. package/convertFromHTML.js +2 -3
  148. package/convertFromHTML.js.flow +15 -17
  149. package/convertFromJSON.js +1 -2
  150. package/convertFromJSON.js.flow +55 -56
  151. package/convertToCSSPTValue.js +6 -10
  152. package/convertToCSSPTValue.js.flow +19 -22
  153. package/convertToJSON.js.flow +7 -7
  154. package/createCommand.js +16 -17
  155. package/createCommand.js.flow +62 -62
  156. package/createEditorKeyMap.js +2 -2
  157. package/createEditorKeyMap.js.flow +94 -94
  158. package/createEmptyEditorState.js +2 -3
  159. package/createEmptyEditorState.js.flow +29 -31
  160. package/createTableResizingPlugin.js +6 -6
  161. package/createTableResizingPlugin.js.flow +86 -86
  162. package/findActionableCell.js.flow +74 -74
  163. package/findActiveMark.js +1 -1
  164. package/findActiveMark.js.flow +32 -32
  165. package/hyphenize.js.flow +17 -17
  166. package/index.d.ts +165 -165
  167. package/index.js.flow +10 -10
  168. package/insertTable.js +0 -3
  169. package/insertTable.js.flow +54 -56
  170. package/isEditorStateEmpty.js.flow +32 -32
  171. package/isTableNode.js.flow +15 -15
  172. package/joinDown.js +1 -3
  173. package/joinDown.js.flow +25 -27
  174. package/joinListNode.js.flow +55 -55
  175. package/joinUp.js +1 -3
  176. package/joinUp.js.flow +37 -39
  177. package/keymaps.js.flow +185 -185
  178. package/lookUpElement.js +2 -1
  179. package/lookUpElement.js.flow +14 -14
  180. package/nodeAt.js.flow +12 -12
  181. package/normalizeHTML.js +3 -1
  182. package/normalizeHTML.js.flow +80 -78
  183. package/package.json +162 -156
  184. package/patchAnchorElements.js +1 -1
  185. package/patchAnchorElements.js.flow +38 -38
  186. package/patchBreakElements.js +3 -2
  187. package/patchBreakElements.js.flow +22 -22
  188. package/patchElementInlineStyles.js +1 -1
  189. package/patchElementInlineStyles.js.flow +92 -92
  190. package/patchListElements.js +4 -4
  191. package/patchListElements.js.flow +276 -276
  192. package/patchMathElements.js +5 -7
  193. package/patchMathElements.js.flow +58 -60
  194. package/patchParagraphElements.js.flow +20 -20
  195. package/patchStyleElements.js +1 -1
  196. package/patchStyleElements.js.flow +197 -196
  197. package/patchTableElements.js +2 -3
  198. package/patchTableElements.js.flow +88 -89
  199. package/rebaseDocWithSteps.js.flow +42 -42
  200. package/sanitizeURL.js +1 -1
  201. package/sanitizeURL.js.flow +13 -13
  202. package/splitListItem.js +3 -3
  203. package/splitListItem.js.flow +191 -191
  204. package/styles.css +19 -19
  205. package/styles0.css +29 -29
  206. package/toClosestFontPtSize.js.flow +22 -22
  207. package/toSafeHTMLDocument.js.flow +9 -9
  208. package/toggleBlockquote.js +4 -5
  209. package/toggleBlockquote.js.flow +101 -108
  210. package/toggleCodeBlock.js +6 -6
  211. package/toggleCodeBlock.js.flow +102 -102
  212. package/ui/AlertInfo.js +15 -16
  213. package/ui/AlertInfo.js.flow +64 -64
  214. package/ui/BookmarkNodeView.js +20 -21
  215. package/ui/BookmarkNodeView.js.flow +66 -66
  216. package/ui/CommandButton.js +15 -16
  217. package/ui/CommandButton.js.flow +68 -68
  218. package/ui/CommandMenu.js +19 -20
  219. package/ui/CommandMenu.js.flow +75 -75
  220. package/ui/CommandMenuButton.js +23 -25
  221. package/ui/CommandMenuButton.js.flow +130 -131
  222. package/ui/CustomEditorView.js +20 -20
  223. package/ui/CustomEditorView.js.flow +29 -28
  224. package/ui/CustomMenu.js +11 -12
  225. package/ui/CustomMenu.js.flow +17 -17
  226. package/ui/CustomMenuItem.js +16 -18
  227. package/ui/CustomMenuItem.js.flow +36 -36
  228. package/ui/CustomNodeView.js +29 -19
  229. package/ui/CustomNodeView.js.flow +207 -200
  230. package/ui/CustomRadioButton.js +18 -21
  231. package/ui/CustomRadioButton.js.flow +64 -65
  232. package/ui/DocLayoutEditor.js +18 -20
  233. package/ui/DocLayoutEditor.js.flow +145 -146
  234. package/ui/Editor.js +30 -28
  235. package/ui/Editor.js.flow +287 -288
  236. package/ui/EditorFrameset.js +13 -14
  237. package/ui/EditorFrameset.js.flow +81 -81
  238. package/ui/EditorToolbar.js +36 -42
  239. package/ui/EditorToolbar.js.flow +199 -218
  240. package/ui/EditorToolbarConfig.js +5 -5
  241. package/ui/EditorToolbarConfig.js.flow +164 -164
  242. package/ui/FontSizeCommandMenuButton.js +14 -15
  243. package/ui/FontSizeCommandMenuButton.js.flow +66 -66
  244. package/ui/FontTypeCommandMenuButton.js +15 -17
  245. package/ui/FontTypeCommandMenuButton.js.flow +60 -61
  246. package/ui/Frag.js +11 -12
  247. package/ui/Frag.js.flow +13 -13
  248. package/ui/Icon.js +21 -24
  249. package/ui/Icon.js.flow +89 -89
  250. package/ui/ImageInlineEditor.js +14 -15
  251. package/ui/ImageInlineEditor.js.flow +67 -67
  252. package/ui/KeyCodes.js.flow +12 -12
  253. package/ui/LinkTooltip.js +68 -34
  254. package/ui/LinkTooltip.js.flow +118 -85
  255. package/ui/LinkURLEditor.js +160 -43
  256. package/ui/LinkURLEditor.js.flow +243 -117
  257. package/ui/ListItemNodeView.js +6 -7
  258. package/ui/ListItemNodeView.js.flow +98 -98
  259. package/ui/ListTypeButton.js +23 -27
  260. package/ui/ListTypeButton.js.flow +128 -131
  261. package/ui/ListTypeCommandButton.js +14 -15
  262. package/ui/ListTypeCommandButton.js.flow +85 -85
  263. package/ui/ListTypeMenu.js +21 -22
  264. package/ui/ListTypeMenu.js.flow +70 -70
  265. package/ui/LoadingIndicator.js +11 -12
  266. package/ui/LoadingIndicator.js.flow +20 -20
  267. package/ui/MathEditor.js +17 -22
  268. package/ui/MathEditor.js.flow +72 -78
  269. package/ui/MathInlineEditor.js +20 -21
  270. package/ui/MathInlineEditor.js.flow +101 -102
  271. package/ui/MathNodeView.js +29 -30
  272. package/ui/MathNodeView.js.flow +176 -186
  273. package/ui/PasteMenu.js +19 -23
  274. package/ui/PasteMenu.js.flow +53 -57
  275. package/ui/ResizeObserver.js +1 -1
  276. package/ui/ResizeObserver.js.flow +106 -106
  277. package/ui/RichTextEditor.js +17 -18
  278. package/ui/RichTextEditor.js.flow +133 -133
  279. package/ui/SelectionObserver.js +8 -9
  280. package/ui/SelectionObserver.js.flow +134 -134
  281. package/ui/TableCellMenu.js +14 -15
  282. package/ui/TableCellMenu.js.flow +51 -51
  283. package/ui/TableGridSizeEditor.js +30 -33
  284. package/ui/TableGridSizeEditor.js.flow +187 -184
  285. package/ui/TableNodeView.js +18 -17
  286. package/ui/TableNodeView.js.flow +25 -25
  287. package/ui/bindScrollHandler.js +2 -1
  288. package/ui/bindScrollHandler.js.flow +46 -46
  289. package/ui/canUseCSSFont.js +5 -4
  290. package/ui/canUseCSSFont.js.flow +42 -43
  291. package/ui/czi-body-layout-editor.css +16 -16
  292. package/ui/czi-bookmark-view.css +10 -10
  293. package/ui/czi-cursor-placeholder.css +36 -36
  294. package/ui/czi-custom-menu-button.css +18 -18
  295. package/ui/czi-custom-menu-item.css +30 -30
  296. package/ui/czi-custom-menu.css +8 -8
  297. package/ui/czi-custom-radio-button.css +80 -80
  298. package/ui/czi-custom-scrollbar.css +21 -21
  299. package/ui/czi-editor-frameset.css +81 -81
  300. package/ui/czi-editor-toolbar.css +122 -122
  301. package/ui/czi-editor.css +217 -220
  302. package/ui/czi-form.css +201 -107
  303. package/ui/czi-frag.css +3 -3
  304. package/ui/czi-heading.css +40 -40
  305. package/ui/czi-icon.css +72 -72
  306. package/ui/czi-image-resize-box.css +165 -165
  307. package/ui/czi-image-upload-editor.css +57 -57
  308. package/ui/czi-image-upload-placeholder.css +50 -50
  309. package/ui/czi-image-url-editor.css +38 -38
  310. package/ui/czi-image-view.css +121 -125
  311. package/ui/czi-indent.css +137 -137
  312. package/ui/czi-inline-editor.css +20 -20
  313. package/ui/czi-link-tooltip.css +112 -71
  314. package/ui/czi-list.css +406 -410
  315. package/ui/czi-loading-indicator.css +66 -111
  316. package/ui/czi-math-view.css +62 -62
  317. package/ui/czi-selection-placeholder.css +24 -24
  318. package/ui/czi-table-cell-menu.css +16 -14
  319. package/ui/czi-table-grid-size-editor.css +37 -37
  320. package/ui/czi-table.css +87 -87
  321. package/ui/czi-vars.css +2 -2
  322. package/ui/findActiveFontSize.js +2 -1
  323. package/ui/findActiveFontSize.js.flow +55 -58
  324. package/ui/findActiveFontType.js +4 -3
  325. package/ui/findActiveFontType.js.flow +35 -38
  326. package/ui/fonts.css +460 -460
  327. package/ui/handleEditorDrop.js +1 -1
  328. package/ui/handleEditorDrop.js.flow +28 -28
  329. package/ui/handleEditorKeyDown.js +1 -1
  330. package/ui/handleEditorKeyDown.js.flow +39 -39
  331. package/ui/handleEditorPaste.js +1 -1
  332. package/ui/handleEditorPaste.js.flow +33 -33
  333. package/ui/htmlElementToRect.js.flow +18 -18
  334. package/ui/icon-font.css +9 -9
  335. package/ui/injectStyleSheet.js +2 -2
  336. package/ui/injectStyleSheet.js.flow +40 -42
  337. package/ui/isElementFullyVisible.js +1 -10
  338. package/ui/isElementFullyVisible.js.flow +14 -26
  339. package/ui/isOffline.js.flow +8 -8
  340. package/ui/isReactClass.js.flow +12 -12
  341. package/ui/listType.css +21 -21
  342. package/ui/mathquill-editor/MathQuillEditor.js +27 -30
  343. package/ui/mathquill-editor/MathQuillEditor.js.flow +158 -159
  344. package/ui/mathquill-editor/MathQuillEditorSymbols.js.flow +483 -483
  345. package/ui/mathquill-editor/MathQuillEditorSymbolsPanel.js +14 -15
  346. package/ui/mathquill-editor/MathQuillEditorSymbolsPanel.js.flow +50 -50
  347. package/ui/mathquill-editor/czi-mathquill-editor-symbols-panel.css +39 -39
  348. package/ui/mathquill-editor/czi-mathquill-editor.css +50 -50
  349. package/ui/mathquill-editor/mathquill-import-kludge.js +1 -8
  350. package/ui/mathquill-editor/mathquill-import-kludge.js.flow +17 -24
  351. package/ui/renderLaTeXAsHTML.js +4 -4
  352. package/ui/renderLaTeXAsHTML.js.flow +46 -46
  353. package/ui/resolveImage.js +5 -6
  354. package/ui/resolveImage.js.flow +121 -123
  355. package/ui/toCSSColor.js.flow +51 -51
  356. package/ui/toCSSLineSpacing.js +2 -3
  357. package/ui/toCSSLineSpacing.js.flow +53 -55
  358. package/ui/toHexColor.js.flow +26 -26
  359. package/ui/uuid.js.flow +9 -9
  360. package/uuid.js.flow +9 -9
@@ -1,192 +1,190 @@
1
- // @flow
2
-
3
- import nullthrows from 'nullthrows';
4
- import { Plugin, PluginKey } from 'prosemirror-state';
5
- import { EditorState, TextSelection } from 'prosemirror-state';
6
- import { Transform } from 'prosemirror-transform';
7
- import { Decoration, DecorationSet } from 'prosemirror-view';
8
- import { EditorView } from 'prosemirror-view';
9
-
10
- import { IMAGE } from './NodeNames.js';
11
- import uuid from './ui/uuid.js';
12
-
13
- import './ui/czi-image-upload-placeholder.css';
14
-
15
- const IMAGE_FILE_TYLES = new Set([
16
- 'image/jpeg',
17
- 'image/gif',
18
- 'image/png',
19
- 'image/jpg',
20
- ]);
21
-
22
- const TITLE = 'Uploading...';
23
-
24
- const INNER_HTML = new Array(4).join(
25
- '<div class="czi-image-upload-placeholder-child"></div>'
26
- );
27
-
28
- function isImageUploadPlaceholderPlugin(plugin: Plugin): boolean {
29
- return plugin instanceof ImageUploadPlaceholderPlugin;
30
- }
31
-
32
- function isImageFileType(file: File): boolean {
33
- return file && IMAGE_FILE_TYLES.has(file.type);
34
- }
35
-
36
- function findImageUploadPlaceholder(
37
- placeholderPlugin: ImageUploadPlaceholderPlugin,
38
- state: EditorState,
39
- id: Object
40
- ): ?Decoration {
41
- const decos = placeholderPlugin.getState(state);
42
- const found = decos.find(null, null, (spec) => spec.id === id);
43
- return found.length ? found[0].from : null;
44
- }
45
-
46
- function defer(fn: Function): Function {
47
- return () => {
48
- setTimeout(fn, 0);
49
- };
50
- }
51
-
52
- export function uploadImageFiles(
53
- view: EditorView,
54
- files: Array<File>,
55
- coords: ?{ x: number, y: number }
56
- ): boolean {
57
- const { runtime, state, readOnly, disabled } = view;
58
- const { schema, plugins } = state;
59
- if (readOnly || disabled || !runtime || !runtime.canUploadImage) {
60
- return false;
61
- }
62
-
63
- const imageType = schema.nodes[IMAGE];
64
- if (!imageType) {
65
- return false;
66
- }
67
-
68
- const { uploadImage, canUploadImage } = runtime;
69
- if (!uploadImage || !canUploadImage) {
70
- return false;
71
- }
72
-
73
- const imageFiles = Array.from(files).filter(isImageFileType);
74
- if (!imageFiles.length) {
75
- return false;
76
- }
77
-
78
- const placeholderPlugin = plugins.find(isImageUploadPlaceholderPlugin);
79
- if (!placeholderPlugin) {
80
- return false;
81
- }
82
-
83
- // A fresh object to act as the ID for this upload.
84
- const id = {
85
- debugId: 'image_upload_' + uuid(),
86
- };
87
-
88
- const uploadNext = defer(() => {
89
- const done = (imageInfo: { src: ?string }) => {
90
- const pos = findImageUploadPlaceholder(placeholderPlugin, view.state, id);
91
- let trNext = view.state.tr;
92
- if (pos && !view.readOnly && !view.disabled) {
93
- const imageNode = imageType.create(imageInfo);
94
- trNext = trNext.replaceWith(pos, pos, imageNode);
95
- } else {
96
- // Upload was cancelled.
97
- imageFiles.length = 0;
98
- }
99
- if (imageFiles.length) {
100
- uploadNext();
101
- } else {
102
- // Remove the placeholder.
103
- trNext = trNext.setMeta(placeholderPlugin, { remove: { id } });
104
- }
105
- view.dispatch(trNext);
106
- };
107
- const ff = nullthrows(imageFiles.shift());
108
- uploadImage(ff)
109
- .then(done)
110
- .catch(done.bind(null, { src: null }));
111
- });
112
-
113
- uploadNext();
114
-
115
- let { tr } = state;
116
-
117
- // Replace the selection with a placeholder
118
- let from = 0;
119
-
120
- // Adjust the cursor to the dropped position.
121
- if (coords) {
122
- const dropPos = view.posAtCoords({
123
- left: coords.x,
124
- top: coords.y,
125
- });
126
-
127
- if (!dropPos) {
128
- return false;
129
- }
130
-
131
- from = dropPos.pos;
132
- tr = tr.setSelection(TextSelection.create(tr.doc, from, from));
133
- } else {
134
- from = tr.selection.to;
135
- tr = tr.setSelection(TextSelection.create(tr.doc, from, from));
136
- }
137
- const meta = {
138
- add: {
139
- id,
140
- pos: from,
141
- },
142
- };
143
-
144
- tr = tr.setMeta(placeholderPlugin, meta);
145
- view.dispatch(tr);
146
- return true;
147
- }
148
-
149
- // https://prosemirror.net/examples/upload/
150
- class ImageUploadPlaceholderPlugin extends Plugin {
151
- constructor() {
152
- super({
153
- // [FS] IRAD-1005 2020-07-07
154
- // Upgrade outdated packages.
155
- key: new PluginKey('ImageUploadPlaceholderPlugin'),
156
- state: {
157
- init() {
158
- return DecorationSet.empty;
159
- },
160
- apply(tr: Transform, set: DecorationSet): DecorationSet {
161
- // Adjust decoration positions to changes made by the transaction
162
- set = set.map(tr.mapping, tr.doc);
163
- // See if the transaction adds or removes any placeholders
164
- const action = tr.getMeta(this);
165
- if (action && action.add) {
166
- const el = document.createElement('div');
167
- el.title = TITLE;
168
- el.className = 'czi-image-upload-placeholder';
169
- el.innerHTML = INNER_HTML;
170
-
171
- const deco = Decoration.widget(action.add.pos, el, {
172
- id: action.add.id,
173
- });
174
-
175
- set = set.add(tr.doc, [deco]);
176
- } else if (action && action.remove) {
177
- const finder = (spec) => spec.id == action.remove.id;
178
- set = set.remove(set.find(null, null, finder));
179
- }
180
- return set;
181
- },
182
- },
183
- props: {
184
- decorations(state: EditorState): DecorationSet {
185
- return this.getState(state);
186
- },
187
- },
188
- });
189
- }
190
- }
191
-
192
- export default ImageUploadPlaceholderPlugin;
1
+ // @flow
2
+
3
+ import nullthrows from 'nullthrows';
4
+ import { EditorState, TextSelection, Plugin, PluginKey } from 'prosemirror-state';
5
+ import { Transform } from 'prosemirror-transform';
6
+ import { Decoration, DecorationSet, EditorView } from 'prosemirror-view';
7
+
8
+ import { IMAGE } from './NodeNames.js';
9
+ import uuid from './ui/uuid.js';
10
+
11
+ import './ui/czi-image-upload-placeholder.css';
12
+
13
+ const IMAGE_FILE_TYLES = new Set([
14
+ 'image/jpeg',
15
+ 'image/gif',
16
+ 'image/png',
17
+ 'image/jpg',
18
+ ]);
19
+
20
+ const TITLE = 'Uploading...';
21
+
22
+ const INNER_HTML = new Array(4).join(
23
+ '<div class="czi-image-upload-placeholder-child"></div>'
24
+ );
25
+
26
+ function isImageUploadPlaceholderPlugin(plugin: Plugin): boolean {
27
+ return plugin instanceof ImageUploadPlaceholderPlugin;
28
+ }
29
+
30
+ function isImageFileType(file: File): boolean {
31
+ return file && IMAGE_FILE_TYLES.has(file.type);
32
+ }
33
+
34
+ function findImageUploadPlaceholder(
35
+ placeholderPlugin: ImageUploadPlaceholderPlugin,
36
+ state: EditorState,
37
+ id: Object
38
+ ): ?Decoration {
39
+ const decos = placeholderPlugin.getState(state);
40
+ const found = decos.find(null, null, (spec) => spec.id === id);
41
+ return found.length ? found[0].from : null;
42
+ }
43
+
44
+ function defer(fn: Function): Function {
45
+ return () => {
46
+ setTimeout(fn, 0);
47
+ };
48
+ }
49
+
50
+ export function uploadImageFiles(
51
+ view: EditorView,
52
+ files: Array<File>,
53
+ coords: ?{ x: number, y: number }
54
+ ): boolean {
55
+ const { runtime, state, readOnly, disabled } = view;
56
+ const { schema, plugins } = state;
57
+ if (readOnly || disabled || !runtime?.canUploadImage) {
58
+ return false;
59
+ }
60
+
61
+ const imageType = schema.nodes[IMAGE];
62
+ if (!imageType) {
63
+ return false;
64
+ }
65
+
66
+ const { uploadImage, canUploadImage } = runtime;
67
+ if (!uploadImage || !canUploadImage) {
68
+ return false;
69
+ }
70
+
71
+ const imageFiles = Array.from(files).filter(isImageFileType);
72
+ if (!imageFiles.length) {
73
+ return false;
74
+ }
75
+
76
+ const placeholderPlugin = plugins.find(isImageUploadPlaceholderPlugin);
77
+ if (!placeholderPlugin) {
78
+ return false;
79
+ }
80
+
81
+ // A fresh object to act as the ID for this upload.
82
+ const id = {
83
+ debugId: 'image_upload_' + uuid(),
84
+ };
85
+
86
+ const uploadNext = defer(() => {
87
+ const done = (imageInfo: { src: ?string }) => {
88
+ const pos = findImageUploadPlaceholder(placeholderPlugin, view.state, id);
89
+ let trNext = view.state.tr;
90
+ if (pos && !view.readOnly && !view.disabled) {
91
+ const imageNode = imageType.create(imageInfo);
92
+ trNext = trNext.replaceWith(pos, pos, imageNode);
93
+ } else {
94
+ // Upload was cancelled.
95
+ imageFiles.length = 0;
96
+ }
97
+ if (imageFiles.length) {
98
+ uploadNext();
99
+ } else {
100
+ // Remove the placeholder.
101
+ trNext = trNext.setMeta(placeholderPlugin, { remove: { id } });
102
+ }
103
+ view.dispatch(trNext);
104
+ };
105
+ const ff = nullthrows(imageFiles.shift());
106
+ uploadImage(ff)
107
+ .then(done)
108
+ .catch(done.bind(null, { src: null }));
109
+ });
110
+
111
+ uploadNext();
112
+
113
+ let { tr } = state;
114
+
115
+ // Replace the selection with a placeholder
116
+ let from = 0;
117
+
118
+ // Adjust the cursor to the dropped position.
119
+ if (coords) {
120
+ const dropPos = view.posAtCoords({
121
+ left: coords.x,
122
+ top: coords.y,
123
+ });
124
+
125
+ if (!dropPos) {
126
+ return false;
127
+ }
128
+
129
+ from = dropPos.pos;
130
+ tr = tr.setSelection(TextSelection.create(tr.doc, from, from));
131
+ } else {
132
+ from = tr.selection.to;
133
+ tr = tr.setSelection(TextSelection.create(tr.doc, from, from));
134
+ }
135
+ const meta = {
136
+ add: {
137
+ id,
138
+ pos: from,
139
+ },
140
+ };
141
+
142
+ tr = tr.setMeta(placeholderPlugin, meta);
143
+ view.dispatch(tr);
144
+ return true;
145
+ }
146
+
147
+ // https://prosemirror.net/examples/upload/
148
+ class ImageUploadPlaceholderPlugin extends Plugin {
149
+ constructor() {
150
+ super({
151
+ // [FS] IRAD-1005 2020-07-07
152
+ // Upgrade outdated packages.
153
+ key: new PluginKey('ImageUploadPlaceholderPlugin'),
154
+ state: {
155
+ init() {
156
+ return DecorationSet.empty;
157
+ },
158
+ apply(tr: Transform, set: DecorationSet): DecorationSet {
159
+ // Adjust decoration positions to changes made by the transaction
160
+ set = set.map(tr.mapping, tr.doc);
161
+ // See if the transaction adds or removes any placeholders
162
+ const action = tr.getMeta(this);
163
+ if (action?.add) {
164
+ const el = document.createElement('div');
165
+ el.title = TITLE;
166
+ el.className = 'czi-image-upload-placeholder';
167
+ el.innerHTML = INNER_HTML;
168
+
169
+ const deco = Decoration.widget(action.add.pos, el, {
170
+ id: action.add.id,
171
+ });
172
+
173
+ set = set.add(tr.doc, [deco]);
174
+ } else if (action?.remove) {
175
+ const finder = (spec) => spec.id == action.remove.id;
176
+ set = set.remove(set.find(null, null, finder));
177
+ }
178
+ return set;
179
+ },
180
+ },
181
+ props: {
182
+ decorations(state: EditorState): DecorationSet {
183
+ return this.getState(state);
184
+ },
185
+ },
186
+ });
187
+ }
188
+ }
189
+
190
+ export default ImageUploadPlaceholderPlugin;
package/LinkMarkSpec.js CHANGED
@@ -11,6 +11,9 @@ var LinkMarkSpec = {
11
11
  },
12
12
  title: {
13
13
  "default": null
14
+ },
15
+ selectionId: {
16
+ "default": null
14
17
  }
15
18
  },
16
19
  inclusive: false,
@@ -19,10 +22,12 @@ var LinkMarkSpec = {
19
22
  getAttrs: function getAttrs(dom) {
20
23
  var href = dom.getAttribute('href');
21
24
  var target = href && href.indexOf('#') === 0 ? '' : 'blank';
25
+ var selectionId = dom.getAttribute('selectionId') || '';
22
26
  return {
23
27
  href: dom.getAttribute('href'),
24
28
  title: dom.getAttribute('title'),
25
- target: target
29
+ target: target,
30
+ selectionId: selectionId
26
31
  };
27
32
  }
28
33
  }],
@@ -1,32 +1,37 @@
1
- // @flow
2
-
3
- import type { MarkSpec } from './Types.js';
4
-
5
- const LinkMarkSpec: MarkSpec = {
6
- attrs: {
7
- href: { default: null },
8
- rel: { default: 'noopener noreferrer nofollow' },
9
- target: { default: 'blank' },
10
- title: { default: null },
11
- },
12
- inclusive: false,
13
- parseDOM: [
14
- {
15
- tag: 'a[href]',
16
- getAttrs: (dom) => {
17
- const href = dom.getAttribute('href');
18
- const target = href && href.indexOf('#') === 0 ? '' : 'blank';
19
- return {
20
- href: dom.getAttribute('href'),
21
- title: dom.getAttribute('title'),
22
- target,
23
- };
24
- },
25
- },
26
- ],
27
- toDOM(node) {
28
- return ['a', node.attrs, 0];
29
- },
30
- };
31
-
32
- export default LinkMarkSpec;
1
+ // @flow
2
+
3
+ import type { MarkSpec } from './Types.js';
4
+
5
+ const LinkMarkSpec: MarkSpec = {
6
+ attrs: {
7
+ href: { default: null },
8
+ rel: { default: 'noopener noreferrer nofollow' },
9
+ target: { default: 'blank' },
10
+ title: { default: null },
11
+ selectionId: {
12
+ default: null,
13
+ },
14
+ },
15
+ inclusive: false,
16
+ parseDOM: [
17
+ {
18
+ tag: 'a[href]',
19
+ getAttrs: (dom) => {
20
+ const href = dom.getAttribute('href');
21
+ const target = href && href.indexOf('#') === 0 ? '' : 'blank';
22
+ const selectionId = dom.getAttribute('selectionId') || '';
23
+ return {
24
+ href: dom.getAttribute('href'),
25
+ title: dom.getAttribute('title'),
26
+ target,
27
+ selectionId,
28
+ };
29
+ },
30
+ },
31
+ ],
32
+ toDOM(node) {
33
+ return ['a', node.attrs, 0];
34
+ },
35
+ };
36
+
37
+ export default LinkMarkSpec;