@modusoperandi/licit 1.4.2 → 1.4.6

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 (228) hide show
  1. package/BlockquoteInsertNewLineCommand.js.flow +70 -70
  2. package/BlockquoteNodeSpec.js.flow +29 -29
  3. package/BlockquoteToggleCommand.js.flow +56 -56
  4. package/BookmarkNodeSpec.js.flow +39 -39
  5. package/BulletListNodeSpec.js.flow +61 -61
  6. package/CZIProseMirror.js.flow +90 -90
  7. package/CodeBlockCommand.js.flow +65 -65
  8. package/CodeBlockNodeSpec.js.flow +24 -24
  9. package/CodeMarkSpec.js.flow +14 -14
  10. package/ContentPlaceholderPlugin.js.flow +183 -183
  11. package/CursorPlaceholderPlugin.js.flow +113 -113
  12. package/DocLayoutCommand.js.flow +97 -97
  13. package/DocNodeSpec.js.flow +62 -62
  14. package/EMMarkSpec.js.flow +39 -39
  15. package/EditorCommands.js.flow +124 -124
  16. package/EditorKeyMap.js.flow +173 -173
  17. package/EditorMarks.js +4 -2
  18. package/EditorMarks.js.flow +77 -74
  19. package/EditorNodes.js.flow +55 -55
  20. package/EditorPageLayoutPlugin.js.flow +67 -67
  21. package/EditorPlugins.js.flow +8 -8
  22. package/EditorSchema.js.flow +12 -12
  23. package/EditorState.js.flow +7 -7
  24. package/FontSizeMarkSpec.js.flow +54 -54
  25. package/FontTypeMarkSpec.js.flow +89 -89
  26. package/HTMLMutator.js.flow +58 -58
  27. package/HangingIndentMarkSpec.js +34 -0
  28. package/HangingIndentMarkSpec.js.flow +30 -0
  29. package/HardBreakNodeSpec.js.flow +15 -15
  30. package/HeadingNodeSpec.js.flow +42 -42
  31. package/HistoryRedoCommand.js.flow +41 -41
  32. package/HistoryUndoCommand.js.flow +41 -41
  33. package/HorizontalRuleCommand.js.flow +71 -71
  34. package/HorizontalRuleNodeSpec.js.flow +39 -39
  35. package/ImageUploadPlaceholderPlugin.js.flow +187 -187
  36. package/LICENSE +22 -22
  37. package/LinkMarkSpec.js +4 -2
  38. package/LinkMarkSpec.js.flow +38 -37
  39. package/LinkSetURLCommand.js +1 -1
  40. package/LinkSetURLCommand.js.flow +129 -129
  41. package/LinkTooltipPlugin.js +32 -38
  42. package/LinkTooltipPlugin.js.flow +204 -217
  43. package/ListItemInsertNewLineCommand.js.flow +76 -76
  44. package/ListItemMergeCommand.js.flow +197 -197
  45. package/ListItemNodeSpec.js.flow +52 -52
  46. package/ListSplitCommand.js.flow +54 -54
  47. package/ListToggleCommand.js.flow +99 -99
  48. package/MarkNames.js +2 -1
  49. package/MarkNames.js.flow +20 -19
  50. package/MarksClearCommand.js.flow +66 -66
  51. package/NodeNames.js.flow +23 -23
  52. package/OrderedListNodeSpec.js.flow +131 -131
  53. package/OverrideMarkSpec.js.flow +49 -49
  54. package/ParagraphNodeSpec.js +21 -2
  55. package/ParagraphNodeSpec.js.flow +233 -215
  56. package/ParagraphSpacingCommand.js.flow +139 -139
  57. package/PrintCommand.js.flow +53 -53
  58. package/SelectionPlaceholderPlugin.js.flow +129 -129
  59. package/SpacerMarkSpec.js.flow +47 -47
  60. package/StrikeMarkSpec.js.flow +24 -24
  61. package/StrongMarkSpec.js.flow +39 -39
  62. package/StyleView.js.flow +18 -18
  63. package/TableBackgroundColorCommand.js.flow +79 -79
  64. package/TableBorderColorCommand.js +5 -3
  65. package/TableBorderColorCommand.js.flow +108 -106
  66. package/TableCellColorCommand.js.flow +73 -73
  67. package/TableCellMenuPlugin.js.flow +129 -129
  68. package/TableInsertCommand.js.flow +117 -117
  69. package/TableMergeCellsCommand.js.flow +113 -113
  70. package/TableNodesSpecs.js.flow +144 -144
  71. package/TablePlugins.js.flow +14 -14
  72. package/TableResizePlugin.js.flow +636 -636
  73. package/TextColorMarkSpec.js.flow +40 -40
  74. package/TextHighlightMarkSpec.js.flow +47 -47
  75. package/TextInsertTabSpaceCommand.js +0 -3
  76. package/TextInsertTabSpaceCommand.js.flow +103 -106
  77. package/TextNoWrapMarkSpec.js.flow +14 -14
  78. package/TextNodeSpec.js.flow +7 -7
  79. package/TextSelectionMarkSpec.js.flow +24 -24
  80. package/TextSubMarkSpec.js.flow +28 -28
  81. package/TextSuperMarkSpec.js.flow +28 -28
  82. package/TextUnderlineMarkSpec.js.flow +24 -24
  83. package/Types.js.flow +77 -77
  84. package/WebFontLoader.js.flow +22 -22
  85. package/blockQuoteInputRule.js.flow +36 -36
  86. package/bom.xml +8645 -8637
  87. package/browser.js.flow +7 -7
  88. package/buildEditorPlugins.js.flow +48 -48
  89. package/buildInputRules.js.flow +85 -85
  90. package/client/CollabConnector.js.flow +90 -90
  91. package/client/EditorConnection.js.flow +324 -324
  92. package/client/Licit.js +40 -40
  93. package/client/Licit.js.flow +649 -648
  94. package/client/Licit.test.js.flow +104 -104
  95. package/client/Reporter.js.flow +35 -35
  96. package/client/SimpleConnector.js.flow +61 -61
  97. package/client/http.js.flow +60 -60
  98. package/client/licit.css +12 -12
  99. package/client/throttle.js.flow +27 -27
  100. package/convertFromDOMElement.js.flow +33 -33
  101. package/convertFromHTML.js.flow +15 -15
  102. package/convertFromJSON.js.flow +53 -53
  103. package/convertToCSSPTValue.js.flow +19 -19
  104. package/convertToJSON.js.flow +7 -7
  105. package/createCommand.js.flow +62 -62
  106. package/createEditorKeyMap.js.flow +87 -87
  107. package/createEmptyEditorState.js.flow +29 -29
  108. package/createTableResizingPlugin.js.flow +86 -86
  109. package/findActionableCell.js.flow +74 -74
  110. package/findActiveMark.js.flow +32 -32
  111. package/hyphenize.js.flow +17 -17
  112. package/index.d.ts +167 -167
  113. package/index.js.flow +10 -10
  114. package/insertTable.js.flow +54 -54
  115. package/isEditorStateEmpty.js.flow +32 -32
  116. package/isTableNode.js.flow +15 -15
  117. package/joinDown.js.flow +25 -25
  118. package/joinListNode.js.flow +55 -55
  119. package/joinUp.js.flow +37 -37
  120. package/keymaps.js.flow +175 -175
  121. package/lookUpElement.js.flow +14 -14
  122. package/nodeAt.js.flow +12 -12
  123. package/normalizeHTML.js.flow +80 -80
  124. package/package.json +152 -152
  125. package/patchAnchorElements.js.flow +38 -38
  126. package/patchBreakElements.js.flow +22 -22
  127. package/patchElementInlineStyles.js.flow +92 -92
  128. package/patchListElements.js.flow +275 -275
  129. package/patchMathElements.js.flow +58 -58
  130. package/patchParagraphElements.js.flow +20 -20
  131. package/patchStyleElements.js.flow +197 -197
  132. package/patchTableElements.js.flow +88 -88
  133. package/rebaseDocWithSteps.js.flow +42 -42
  134. package/sanitizeURL.js.flow +13 -13
  135. package/splitListItem.js.flow +191 -191
  136. package/styles.css +46 -46
  137. package/toClosestFontPtSize.js.flow +22 -22
  138. package/toSafeHTMLDocument.js.flow +9 -9
  139. package/toggleBlockquote.js.flow +101 -101
  140. package/toggleCodeBlock.js.flow +102 -102
  141. package/ui/AlertInfo.js.flow +63 -63
  142. package/ui/BookmarkNodeView.js.flow +64 -64
  143. package/ui/CommandButton.js.flow +68 -68
  144. package/ui/CommandMenu.js.flow +74 -74
  145. package/ui/CommandMenuButton.js.flow +128 -128
  146. package/ui/CustomEditorView.js.flow +29 -29
  147. package/ui/CustomMenu.js.flow +14 -14
  148. package/ui/CustomMenuItem.js.flow +35 -35
  149. package/ui/CustomNodeView.js.flow +207 -207
  150. package/ui/CustomRadioButton.js.flow +63 -63
  151. package/ui/DocLayoutEditor.js.flow +130 -130
  152. package/ui/Editor.js.flow +281 -281
  153. package/ui/EditorFrameset.js.flow +79 -79
  154. package/ui/EditorToolbar.js.flow +197 -197
  155. package/ui/EditorToolbarConfig.js.flow +162 -162
  156. package/ui/FontSizeCommandMenuButton.js.flow +66 -66
  157. package/ui/FontTypeCommandMenuButton.js.flow +60 -60
  158. package/ui/Frag.js.flow +11 -11
  159. package/ui/Icon.js +1 -1
  160. package/ui/Icon.js.flow +82 -82
  161. package/ui/ImageInlineEditor.js.flow +66 -66
  162. package/ui/KeyCodes.js.flow +12 -12
  163. package/ui/LinkTooltip.js.flow +51 -51
  164. package/ui/LinkURLEditor.js.flow +227 -227
  165. package/ui/ListItemNodeView.js.flow +101 -101
  166. package/ui/ListTypeButton.js.flow +121 -121
  167. package/ui/ListTypeCommandButton.js.flow +85 -85
  168. package/ui/ListTypeMenu.js.flow +78 -78
  169. package/ui/LoadingIndicator.js.flow +19 -19
  170. package/ui/PasteMenu.js.flow +52 -52
  171. package/ui/ResizeObserver.js.flow +105 -105
  172. package/ui/RichTextEditor.js.flow +133 -133
  173. package/ui/SelectionObserver.js.flow +134 -134
  174. package/ui/TableCellMenu.js.flow +49 -49
  175. package/ui/TableGridSizeEditor.js.flow +185 -185
  176. package/ui/TableNodeView.js.flow +36 -36
  177. package/ui/bindScrollHandler.js.flow +46 -46
  178. package/ui/canUseCSSFont.js.flow +42 -42
  179. package/ui/czi-body-layout-editor.css +16 -16
  180. package/ui/czi-bookmark-view.css +10 -10
  181. package/ui/czi-cursor-placeholder.css +36 -36
  182. package/ui/czi-custom-menu-button.css +18 -18
  183. package/ui/czi-custom-menu-item.css +30 -30
  184. package/ui/czi-custom-menu.css +8 -8
  185. package/ui/czi-custom-radio-button.css +80 -80
  186. package/ui/czi-custom-scrollbar.css +21 -21
  187. package/ui/czi-editor-frameset.css +81 -81
  188. package/ui/czi-editor-toolbar.css +122 -122
  189. package/ui/czi-editor.css +239 -216
  190. package/ui/czi-form.css +201 -201
  191. package/ui/czi-frag.css +3 -3
  192. package/ui/czi-heading.css +40 -40
  193. package/ui/czi-icon.css +72 -72
  194. package/ui/czi-image-resize-box.css +165 -165
  195. package/ui/czi-image-upload-editor.css +57 -57
  196. package/ui/czi-image-upload-placeholder.css +50 -50
  197. package/ui/czi-image-url-editor.css +38 -38
  198. package/ui/czi-image-view.css +121 -121
  199. package/ui/czi-indent.css +137 -137
  200. package/ui/czi-inline-editor.css +20 -20
  201. package/ui/czi-link-tooltip.css +112 -112
  202. package/ui/czi-list.css +406 -406
  203. package/ui/czi-loading-indicator.css +66 -66
  204. package/ui/czi-math-view.css +62 -62
  205. package/ui/czi-selection-placeholder.css +24 -24
  206. package/ui/czi-table-cell-menu.css +16 -16
  207. package/ui/czi-table-grid-size-editor.css +37 -37
  208. package/ui/czi-table.css +89 -89
  209. package/ui/czi-vars.css +47 -45
  210. package/ui/findActiveFontSize.js.flow +55 -55
  211. package/ui/findActiveFontType.js.flow +35 -35
  212. package/ui/fonts.css +460 -460
  213. package/ui/handleEditorDrop.js.flow +28 -28
  214. package/ui/handleEditorKeyDown.js.flow +39 -39
  215. package/ui/handleEditorPaste.js.flow +33 -33
  216. package/ui/htmlElementToRect.js.flow +18 -18
  217. package/ui/icon-font.css +9 -9
  218. package/ui/injectStyleSheet.js.flow +40 -40
  219. package/ui/isElementFullyVisible.js.flow +14 -14
  220. package/ui/isOffline.js.flow +8 -8
  221. package/ui/isReactClass.js.flow +12 -12
  222. package/ui/listType.css +21 -21
  223. package/ui/resolveImage.js.flow +121 -121
  224. package/ui/toCSSColor.js.flow +51 -51
  225. package/ui/toCSSLineSpacing.js.flow +53 -53
  226. package/ui/toHexColor.js.flow +26 -26
  227. package/ui/uuid.js.flow +9 -9
  228. package/uuid.js.flow +9 -9
@@ -1,101 +1,101 @@
1
- // @flow
2
-
3
- import {
4
- Schema
5
- } from 'prosemirror-model';
6
- import {
7
- Transform
8
- } from 'prosemirror-transform';
9
-
10
- import {
11
- BLOCKQUOTE,
12
- HEADING,
13
- LIST_ITEM,
14
- PARAGRAPH
15
- } from './NodeNames.js';
16
- import {
17
- compareNumber, isInsideListItem, isListNode, unwrapNodesFromList
18
- } from '@modusoperandi/licit-ui-commands';
19
-
20
- export default function toggleBlockquote(
21
- tr: Transform,
22
- schema: Schema
23
- ): Transform {
24
- const { nodes } = schema;
25
- const { selection, doc } = tr;
26
- const heading = nodes[HEADING];
27
- const blockquote = nodes[BLOCKQUOTE];
28
- const paragraph = nodes[PARAGRAPH];
29
- const listItem = nodes[LIST_ITEM];
30
-
31
- if (!selection || !doc || !heading || !paragraph || !listItem) {
32
- return tr;
33
- }
34
-
35
- const { from, to } = tr.selection;
36
- let startWithBlockQuote = null;
37
- const poses = [];
38
- doc.nodesBetween(from, to, (node, pos, parentNode) => {
39
- const nodeType = node.type;
40
- const parentNodeType = parentNode.type;
41
-
42
- if (startWithBlockQuote === null) {
43
- startWithBlockQuote = nodeType === blockquote;
44
- }
45
-
46
- if (parentNodeType !== listItem) {
47
- poses.push(pos);
48
- }
49
- return !isListNode(node);
50
- });
51
- // Update from the bottom to avoid disruptive changes in pos.
52
- const sortedPoses = [...poses]; // Create a shallow copy of poses
53
- sortedPoses.sort(compareNumber);
54
-
55
- sortedPoses.sort(compareNumber)
56
- .reverse()
57
- .forEach((pos) => {
58
- tr = setBlockquoteNode(tr, schema, pos);
59
- });
60
- return tr;
61
- }
62
-
63
- function setBlockquoteNode(
64
- tr: Transform,
65
- schema: Schema,
66
- pos: number
67
- ): Transform {
68
- const { nodes } = schema;
69
- const heading = nodes[HEADING];
70
- const paragraph = nodes[PARAGRAPH];
71
- const blockquote = nodes[BLOCKQUOTE];
72
-
73
- if (pos >= tr.doc.content.size) {
74
- // Workaround to handle the edge case that pos was shifted caused by `toggleList`.
75
- return tr;
76
- }
77
- const node = tr.doc.nodeAt(pos);
78
-
79
- if (!node || !heading || !paragraph) {
80
- return tr;
81
- }
82
-
83
- const nodeType = node.type;
84
- if (isInsideListItem(tr.doc, pos)) {
85
- return tr;
86
- } else if (isListNode(node)) {
87
- // Toggle list
88
- if (blockquote) {
89
- tr = unwrapNodesFromList(tr, schema, pos, (paragraphNode) => {
90
- const { content, marks, attrs } = paragraphNode;
91
- return blockquote.create(attrs, content, marks);
92
- });
93
- }
94
- } else if (nodeType === blockquote) {
95
- // Toggle heading
96
- tr = tr.setNodeMarkup(pos, paragraph, node.attrs, node.marks);
97
- } else if (nodeType === paragraph || nodeType === heading) {
98
- tr = tr.setNodeMarkup(pos, blockquote, node.attrs, node.marks);
99
- }
100
- return tr;
101
- }
1
+ // @flow
2
+
3
+ import {
4
+ Schema
5
+ } from 'prosemirror-model';
6
+ import {
7
+ Transform
8
+ } from 'prosemirror-transform';
9
+
10
+ import {
11
+ BLOCKQUOTE,
12
+ HEADING,
13
+ LIST_ITEM,
14
+ PARAGRAPH
15
+ } from './NodeNames.js';
16
+ import {
17
+ compareNumber, isInsideListItem, isListNode, unwrapNodesFromList
18
+ } from '@modusoperandi/licit-ui-commands';
19
+
20
+ export default function toggleBlockquote(
21
+ tr: Transform,
22
+ schema: Schema
23
+ ): Transform {
24
+ const { nodes } = schema;
25
+ const { selection, doc } = tr;
26
+ const heading = nodes[HEADING];
27
+ const blockquote = nodes[BLOCKQUOTE];
28
+ const paragraph = nodes[PARAGRAPH];
29
+ const listItem = nodes[LIST_ITEM];
30
+
31
+ if (!selection || !doc || !heading || !paragraph || !listItem) {
32
+ return tr;
33
+ }
34
+
35
+ const { from, to } = tr.selection;
36
+ let startWithBlockQuote = null;
37
+ const poses = [];
38
+ doc.nodesBetween(from, to, (node, pos, parentNode) => {
39
+ const nodeType = node.type;
40
+ const parentNodeType = parentNode.type;
41
+
42
+ if (startWithBlockQuote === null) {
43
+ startWithBlockQuote = nodeType === blockquote;
44
+ }
45
+
46
+ if (parentNodeType !== listItem) {
47
+ poses.push(pos);
48
+ }
49
+ return !isListNode(node);
50
+ });
51
+ // Update from the bottom to avoid disruptive changes in pos.
52
+ const sortedPoses = [...poses]; // Create a shallow copy of poses
53
+ sortedPoses.sort(compareNumber);
54
+
55
+ sortedPoses.sort(compareNumber)
56
+ .reverse()
57
+ .forEach((pos) => {
58
+ tr = setBlockquoteNode(tr, schema, pos);
59
+ });
60
+ return tr;
61
+ }
62
+
63
+ function setBlockquoteNode(
64
+ tr: Transform,
65
+ schema: Schema,
66
+ pos: number
67
+ ): Transform {
68
+ const { nodes } = schema;
69
+ const heading = nodes[HEADING];
70
+ const paragraph = nodes[PARAGRAPH];
71
+ const blockquote = nodes[BLOCKQUOTE];
72
+
73
+ if (pos >= tr.doc.content.size) {
74
+ // Workaround to handle the edge case that pos was shifted caused by `toggleList`.
75
+ return tr;
76
+ }
77
+ const node = tr.doc.nodeAt(pos);
78
+
79
+ if (!node || !heading || !paragraph) {
80
+ return tr;
81
+ }
82
+
83
+ const nodeType = node.type;
84
+ if (isInsideListItem(tr.doc, pos)) {
85
+ return tr;
86
+ } else if (isListNode(node)) {
87
+ // Toggle list
88
+ if (blockquote) {
89
+ tr = unwrapNodesFromList(tr, schema, pos, (paragraphNode) => {
90
+ const { content, marks, attrs } = paragraphNode;
91
+ return blockquote.create(attrs, content, marks);
92
+ });
93
+ }
94
+ } else if (nodeType === blockquote) {
95
+ // Toggle heading
96
+ tr = tr.setNodeMarkup(pos, paragraph, node.attrs, node.marks);
97
+ } else if (nodeType === paragraph || nodeType === heading) {
98
+ tr = tr.setNodeMarkup(pos, blockquote, node.attrs, node.marks);
99
+ }
100
+ return tr;
101
+ }
@@ -1,102 +1,102 @@
1
- // @flow
2
-
3
- import { Schema } from 'prosemirror-model';
4
- import { TextSelection } from 'prosemirror-state';
5
- import { Transform } from 'prosemirror-transform';
6
-
7
- import { MARK_LINK } from './MarkNames';
8
- import { BLOCKQUOTE, CODE_BLOCK, HEADING, PARAGRAPH } from './NodeNames';
9
- import {
10
- clearMarks,
11
- compareNumber,
12
- isListNode,
13
- } from '@modusoperandi/licit-ui-commands';
14
-
15
- export default function toggleCodeBlock(
16
- tr: Transform,
17
- schema: Schema
18
- ): Transform {
19
- const { nodes } = schema;
20
- const { selection, doc } = tr;
21
- const codeBlock = nodes[CODE_BLOCK];
22
- const paragraph = nodes[PARAGRAPH];
23
- const heading = nodes[HEADING];
24
- const blockquote = nodes[BLOCKQUOTE];
25
- if (!selection || !doc || !codeBlock || !paragraph) {
26
- return tr;
27
- }
28
-
29
- const poses = [];
30
- const { from, to } = tr.selection;
31
- let allowed = true;
32
- let startWithCodeBlock = null;
33
- doc.nodesBetween(from, to, (node, pos) => {
34
- const nodeType = node.type;
35
- if (startWithCodeBlock === null) {
36
- startWithCodeBlock = nodeType === codeBlock;
37
- }
38
- const { type, isBlock } = node;
39
- if (isBlock) {
40
- allowed =
41
- allowed &&
42
- (type === paragraph ||
43
- type === codeBlock ||
44
- type === heading ||
45
- type === blockquote);
46
- allowed && poses.push(pos);
47
- }
48
-
49
- return isBlock;
50
- });
51
-
52
- const sortedPoses = [...poses]; // Create a shallow copy of poses
53
- // Update from the bottom to avoid disruptive changes in pos.
54
- sortedPoses = allowed ? poses.toSorted(compareNumber) : poses;
55
-
56
- allowed &&
57
- sortedPoses
58
- .sort(compareNumber)
59
- .reverse()
60
- .forEach((pos) => {
61
- tr = setCodeBlockNodeEnabled(tr, schema, pos, !startWithCodeBlock);
62
- });
63
- return tr;
64
- }
65
-
66
- function setCodeBlockNodeEnabled(
67
- tr: Transform,
68
- schema: Schema,
69
- pos: number,
70
- enabled: boolean
71
- ): Transform {
72
- const { doc } = tr;
73
- if (!doc) {
74
- return tr;
75
- }
76
-
77
- const node = doc.nodeAt(pos);
78
- if (!node) {
79
- return tr;
80
- }
81
- if (isListNode(node)) {
82
- return tr;
83
- }
84
-
85
- const { nodes } = schema;
86
- const codeBlock = nodes[CODE_BLOCK];
87
- const paragraph = nodes[PARAGRAPH];
88
-
89
- if (codeBlock && !enabled && node.type === codeBlock) {
90
- tr = tr.setNodeMarkup(pos, paragraph, node.attrs, node.marks);
91
- } else if (enabled && node.type !== codeBlock) {
92
- const { selection } = tr;
93
- tr = tr.setSelection(
94
- TextSelection.create(tr.doc, pos, pos + node.nodeSize)
95
- );
96
- tr = clearMarks(tr, schema);
97
- tr = tr.removeMark(pos, pos + node.nodeSize, schema.marks[MARK_LINK]);
98
- tr = tr.setSelection(selection);
99
- tr = tr.setNodeMarkup(pos, codeBlock, node.attrs, node.marks);
100
- }
101
- return tr;
102
- }
1
+ // @flow
2
+
3
+ import { Schema } from 'prosemirror-model';
4
+ import { TextSelection } from 'prosemirror-state';
5
+ import { Transform } from 'prosemirror-transform';
6
+
7
+ import { MARK_LINK } from './MarkNames';
8
+ import { BLOCKQUOTE, CODE_BLOCK, HEADING, PARAGRAPH } from './NodeNames';
9
+ import {
10
+ clearMarks,
11
+ compareNumber,
12
+ isListNode,
13
+ } from '@modusoperandi/licit-ui-commands';
14
+
15
+ export default function toggleCodeBlock(
16
+ tr: Transform,
17
+ schema: Schema
18
+ ): Transform {
19
+ const { nodes } = schema;
20
+ const { selection, doc } = tr;
21
+ const codeBlock = nodes[CODE_BLOCK];
22
+ const paragraph = nodes[PARAGRAPH];
23
+ const heading = nodes[HEADING];
24
+ const blockquote = nodes[BLOCKQUOTE];
25
+ if (!selection || !doc || !codeBlock || !paragraph) {
26
+ return tr;
27
+ }
28
+
29
+ const poses = [];
30
+ const { from, to } = tr.selection;
31
+ let allowed = true;
32
+ let startWithCodeBlock = null;
33
+ doc.nodesBetween(from, to, (node, pos) => {
34
+ const nodeType = node.type;
35
+ if (startWithCodeBlock === null) {
36
+ startWithCodeBlock = nodeType === codeBlock;
37
+ }
38
+ const { type, isBlock } = node;
39
+ if (isBlock) {
40
+ allowed =
41
+ allowed &&
42
+ (type === paragraph ||
43
+ type === codeBlock ||
44
+ type === heading ||
45
+ type === blockquote);
46
+ allowed && poses.push(pos);
47
+ }
48
+
49
+ return isBlock;
50
+ });
51
+
52
+ const sortedPoses = [...poses]; // Create a shallow copy of poses
53
+ // Update from the bottom to avoid disruptive changes in pos.
54
+ sortedPoses = allowed ? poses.toSorted(compareNumber) : poses;
55
+
56
+ allowed &&
57
+ sortedPoses
58
+ .sort(compareNumber)
59
+ .reverse()
60
+ .forEach((pos) => {
61
+ tr = setCodeBlockNodeEnabled(tr, schema, pos, !startWithCodeBlock);
62
+ });
63
+ return tr;
64
+ }
65
+
66
+ function setCodeBlockNodeEnabled(
67
+ tr: Transform,
68
+ schema: Schema,
69
+ pos: number,
70
+ enabled: boolean
71
+ ): Transform {
72
+ const { doc } = tr;
73
+ if (!doc) {
74
+ return tr;
75
+ }
76
+
77
+ const node = doc.nodeAt(pos);
78
+ if (!node) {
79
+ return tr;
80
+ }
81
+ if (isListNode(node)) {
82
+ return tr;
83
+ }
84
+
85
+ const { nodes } = schema;
86
+ const codeBlock = nodes[CODE_BLOCK];
87
+ const paragraph = nodes[PARAGRAPH];
88
+
89
+ if (codeBlock && !enabled && node.type === codeBlock) {
90
+ tr = tr.setNodeMarkup(pos, paragraph, node.attrs, node.marks);
91
+ } else if (enabled && node.type !== codeBlock) {
92
+ const { selection } = tr;
93
+ tr = tr.setSelection(
94
+ TextSelection.create(tr.doc, pos, pos + node.nodeSize)
95
+ );
96
+ tr = clearMarks(tr, schema);
97
+ tr = tr.removeMark(pos, pos + node.nodeSize, schema.marks[MARK_LINK]);
98
+ tr = tr.setSelection(selection);
99
+ tr = tr.setNodeMarkup(pos, codeBlock, node.attrs, node.marks);
100
+ }
101
+ return tr;
102
+ }
@@ -1,63 +1,63 @@
1
- // @flow
2
-
3
- import * as React from 'react';
4
- import PropTypes from 'prop-types';
5
-
6
- class AlertInfo extends React.PureComponent<any, any> {
7
- _unmounted = false;
8
-
9
- constructor(props: any) {
10
- super(props);
11
- }
12
-
13
- // [FS] IRAD-1005 2020-07-07
14
- // Upgrade outdated packages.
15
- // To take care of the property type declaration.
16
- static propsTypes = {
17
- initialValue: PropTypes.object,
18
- close: function (props: any, propName: string) {
19
- const fn = props[propName];
20
- if (
21
- !fn.prototype ||
22
- (typeof fn.prototype.constructor !== 'function' &&
23
- fn.prototype.constructor.length !== 1)
24
- ) {
25
- return new Error(
26
- propName + ' must be a function with 1 arg of type ImageLike'
27
- );
28
- }
29
- return null;
30
- },
31
- };
32
-
33
- state = {
34
- ...(this.props.initialValue || {}),
35
- validValue: null,
36
- };
37
-
38
- componentWillUnmount(): void {
39
- this._unmounted = true;
40
- }
41
-
42
- render(): React.Element<any> {
43
- const title = this.props.title || 'Document Error!';
44
- const content =
45
- this.props.content ||
46
- 'Unable to load the document. Have issues in Json format, please verify...';
47
- return (
48
- <div className="licit-alert">
49
- <span className="closebtn" onClick={this._cancel}>
50
- &times;
51
- </span>
52
- <strong>{title}</strong>
53
- <span>{content}</span>
54
- </div>
55
- );
56
- }
57
-
58
- _cancel = (): void => {
59
- this.props.close();
60
- };
61
- }
62
-
63
- export default AlertInfo;
1
+ // @flow
2
+
3
+ import * as React from 'react';
4
+ import PropTypes from 'prop-types';
5
+
6
+ class AlertInfo extends React.PureComponent<any, any> {
7
+ _unmounted = false;
8
+
9
+ constructor(props: any) {
10
+ super(props);
11
+ }
12
+
13
+ // [FS] IRAD-1005 2020-07-07
14
+ // Upgrade outdated packages.
15
+ // To take care of the property type declaration.
16
+ static propsTypes = {
17
+ initialValue: PropTypes.object,
18
+ close: function (props: any, propName: string) {
19
+ const fn = props[propName];
20
+ if (
21
+ !fn.prototype ||
22
+ (typeof fn.prototype.constructor !== 'function' &&
23
+ fn.prototype.constructor.length !== 1)
24
+ ) {
25
+ return new Error(
26
+ propName + ' must be a function with 1 arg of type ImageLike'
27
+ );
28
+ }
29
+ return null;
30
+ },
31
+ };
32
+
33
+ state = {
34
+ ...(this.props.initialValue || {}),
35
+ validValue: null,
36
+ };
37
+
38
+ componentWillUnmount(): void {
39
+ this._unmounted = true;
40
+ }
41
+
42
+ render(): React.Element<any> {
43
+ const title = this.props.title || 'Document Error!';
44
+ const content =
45
+ this.props.content ||
46
+ 'Unable to load the document. Have issues in Json format, please verify...';
47
+ return (
48
+ <div className="licit-alert">
49
+ <span className="closebtn" onClick={this._cancel}>
50
+ &times;
51
+ </span>
52
+ <strong>{title}</strong>
53
+ <span>{content}</span>
54
+ </div>
55
+ );
56
+ }
57
+
58
+ _cancel = (): void => {
59
+ this.props.close();
60
+ };
61
+ }
62
+
63
+ export default AlertInfo;
@@ -1,64 +1,64 @@
1
- // @flow
2
-
3
- import { Node } from 'prosemirror-model';
4
- import { Decoration } from 'prosemirror-view';
5
- import * as React from 'react';
6
-
7
- import {
8
- ATTRIBUTE_BOOKMARK_ID,
9
- ATTRIBUTE_BOOKMARK_VISIBLE,
10
- } from './../BookmarkNodeSpec.js';
11
- import CustomNodeView from './CustomNodeView.js';
12
- import Icon from './Icon.js';
13
-
14
- import type { NodeViewProps } from './CustomNodeView.js';
15
-
16
- class BookmarkViewBody extends React.PureComponent<any, any> {
17
- props: NodeViewProps;
18
-
19
- render(): React.Element<any> {
20
- const { id, visible } = this.props.node.attrs;
21
- const icon = id && visible ? Icon.get('bookmark') : null;
22
- return <span onClick={this._onClick}>{icon}</span>;
23
- }
24
-
25
- _onClick = (e: SyntheticEvent<>): void => {
26
- e.preventDefault();
27
- const { id } = this.props.node.attrs;
28
- const hash = '#' + id;
29
- if (window.location.hash !== hash) {
30
- window.location.hash = hash;
31
- }
32
- };
33
- }
34
-
35
- class BookmarkNodeView extends CustomNodeView {
36
- // @override
37
- createDOMElement(): HTMLElement {
38
- const el = document.createElement('a');
39
- el.className = 'czi-bookmark-view';
40
- this._updateDOM(el);
41
- return el;
42
- }
43
-
44
- // @override
45
- update(node: Node, decorations: Array<Decoration>): boolean {
46
- super.update(node, decorations);
47
- return true;
48
- }
49
-
50
- // @override
51
- renderReactComponent(): React.Element<any> {
52
- return <BookmarkViewBody {...this.props} />;
53
- }
54
-
55
- _updateDOM(el: HTMLElement): void {
56
- const { id, visible } = this.props.node.attrs;
57
- el.setAttribute('id', id);
58
- el.setAttribute('title', id);
59
- el.setAttribute(ATTRIBUTE_BOOKMARK_ID, id);
60
- visible && el.setAttribute(ATTRIBUTE_BOOKMARK_VISIBLE, 'true');
61
- }
62
- }
63
-
64
- export default BookmarkNodeView;
1
+ // @flow
2
+
3
+ import { Node } from 'prosemirror-model';
4
+ import { Decoration } from 'prosemirror-view';
5
+ import * as React from 'react';
6
+
7
+ import {
8
+ ATTRIBUTE_BOOKMARK_ID,
9
+ ATTRIBUTE_BOOKMARK_VISIBLE,
10
+ } from './../BookmarkNodeSpec.js';
11
+ import CustomNodeView from './CustomNodeView.js';
12
+ import Icon from './Icon.js';
13
+
14
+ import type { NodeViewProps } from './CustomNodeView.js';
15
+
16
+ class BookmarkViewBody extends React.PureComponent<any, any> {
17
+ props: NodeViewProps;
18
+
19
+ render(): React.Element<any> {
20
+ const { id, visible } = this.props.node.attrs;
21
+ const icon = id && visible ? Icon.get('bookmark') : null;
22
+ return <span onClick={this._onClick}>{icon}</span>;
23
+ }
24
+
25
+ _onClick = (e: SyntheticEvent<>): void => {
26
+ e.preventDefault();
27
+ const { id } = this.props.node.attrs;
28
+ const hash = '#' + id;
29
+ if (window.location.hash !== hash) {
30
+ window.location.hash = hash;
31
+ }
32
+ };
33
+ }
34
+
35
+ class BookmarkNodeView extends CustomNodeView {
36
+ // @override
37
+ createDOMElement(): HTMLElement {
38
+ const el = document.createElement('a');
39
+ el.className = 'czi-bookmark-view';
40
+ this._updateDOM(el);
41
+ return el;
42
+ }
43
+
44
+ // @override
45
+ update(node: Node, decorations: Array<Decoration>): boolean {
46
+ super.update(node, decorations);
47
+ return true;
48
+ }
49
+
50
+ // @override
51
+ renderReactComponent(): React.Element<any> {
52
+ return <BookmarkViewBody {...this.props} />;
53
+ }
54
+
55
+ _updateDOM(el: HTMLElement): void {
56
+ const { id, visible } = this.props.node.attrs;
57
+ el.setAttribute('id', id);
58
+ el.setAttribute('title', id);
59
+ el.setAttribute(ATTRIBUTE_BOOKMARK_ID, id);
60
+ visible && el.setAttribute(ATTRIBUTE_BOOKMARK_VISIBLE, 'true');
61
+ }
62
+ }
63
+
64
+ export default BookmarkNodeView;