@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.
- package/BlockquoteInsertNewLineCommand.js.flow +70 -70
- package/BlockquoteNodeSpec.js.flow +29 -29
- package/BlockquoteToggleCommand.js.flow +56 -56
- package/BookmarkNodeSpec.js.flow +39 -39
- package/BulletListNodeSpec.js.flow +61 -61
- package/CZIProseMirror.js.flow +90 -90
- package/CodeBlockCommand.js.flow +65 -65
- package/CodeBlockNodeSpec.js.flow +24 -24
- package/CodeMarkSpec.js.flow +14 -14
- package/ContentPlaceholderPlugin.js.flow +183 -183
- package/CursorPlaceholderPlugin.js.flow +113 -113
- package/DocLayoutCommand.js.flow +97 -97
- package/DocNodeSpec.js.flow +62 -62
- package/EMMarkSpec.js.flow +39 -39
- package/EditorCommands.js.flow +124 -124
- package/EditorKeyMap.js.flow +173 -173
- package/EditorMarks.js +4 -2
- package/EditorMarks.js.flow +77 -74
- package/EditorNodes.js.flow +55 -55
- package/EditorPageLayoutPlugin.js.flow +67 -67
- package/EditorPlugins.js.flow +8 -8
- package/EditorSchema.js.flow +12 -12
- package/EditorState.js.flow +7 -7
- package/FontSizeMarkSpec.js.flow +54 -54
- package/FontTypeMarkSpec.js.flow +89 -89
- package/HTMLMutator.js.flow +58 -58
- package/HangingIndentMarkSpec.js +34 -0
- package/HangingIndentMarkSpec.js.flow +30 -0
- package/HardBreakNodeSpec.js.flow +15 -15
- package/HeadingNodeSpec.js.flow +42 -42
- package/HistoryRedoCommand.js.flow +41 -41
- package/HistoryUndoCommand.js.flow +41 -41
- package/HorizontalRuleCommand.js.flow +71 -71
- package/HorizontalRuleNodeSpec.js.flow +39 -39
- package/ImageUploadPlaceholderPlugin.js.flow +187 -187
- package/LICENSE +22 -22
- package/LinkMarkSpec.js +4 -2
- package/LinkMarkSpec.js.flow +38 -37
- package/LinkSetURLCommand.js +1 -1
- package/LinkSetURLCommand.js.flow +129 -129
- package/LinkTooltipPlugin.js +32 -38
- package/LinkTooltipPlugin.js.flow +204 -217
- package/ListItemInsertNewLineCommand.js.flow +76 -76
- package/ListItemMergeCommand.js.flow +197 -197
- package/ListItemNodeSpec.js.flow +52 -52
- package/ListSplitCommand.js.flow +54 -54
- package/ListToggleCommand.js.flow +99 -99
- package/MarkNames.js +2 -1
- package/MarkNames.js.flow +20 -19
- package/MarksClearCommand.js.flow +66 -66
- package/NodeNames.js.flow +23 -23
- package/OrderedListNodeSpec.js.flow +131 -131
- package/OverrideMarkSpec.js.flow +49 -49
- package/ParagraphNodeSpec.js +21 -2
- package/ParagraphNodeSpec.js.flow +233 -215
- package/ParagraphSpacingCommand.js.flow +139 -139
- package/PrintCommand.js.flow +53 -53
- package/SelectionPlaceholderPlugin.js.flow +129 -129
- package/SpacerMarkSpec.js.flow +47 -47
- package/StrikeMarkSpec.js.flow +24 -24
- package/StrongMarkSpec.js.flow +39 -39
- package/StyleView.js.flow +18 -18
- package/TableBackgroundColorCommand.js.flow +79 -79
- package/TableBorderColorCommand.js +5 -3
- package/TableBorderColorCommand.js.flow +108 -106
- package/TableCellColorCommand.js.flow +73 -73
- package/TableCellMenuPlugin.js.flow +129 -129
- package/TableInsertCommand.js.flow +117 -117
- package/TableMergeCellsCommand.js.flow +113 -113
- package/TableNodesSpecs.js.flow +144 -144
- package/TablePlugins.js.flow +14 -14
- package/TableResizePlugin.js.flow +636 -636
- package/TextColorMarkSpec.js.flow +40 -40
- package/TextHighlightMarkSpec.js.flow +47 -47
- package/TextInsertTabSpaceCommand.js +0 -3
- package/TextInsertTabSpaceCommand.js.flow +103 -106
- package/TextNoWrapMarkSpec.js.flow +14 -14
- package/TextNodeSpec.js.flow +7 -7
- package/TextSelectionMarkSpec.js.flow +24 -24
- package/TextSubMarkSpec.js.flow +28 -28
- package/TextSuperMarkSpec.js.flow +28 -28
- package/TextUnderlineMarkSpec.js.flow +24 -24
- package/Types.js.flow +77 -77
- package/WebFontLoader.js.flow +22 -22
- package/blockQuoteInputRule.js.flow +36 -36
- package/bom.xml +8645 -8637
- package/browser.js.flow +7 -7
- package/buildEditorPlugins.js.flow +48 -48
- package/buildInputRules.js.flow +85 -85
- package/client/CollabConnector.js.flow +90 -90
- package/client/EditorConnection.js.flow +324 -324
- package/client/Licit.js +40 -40
- package/client/Licit.js.flow +649 -648
- package/client/Licit.test.js.flow +104 -104
- package/client/Reporter.js.flow +35 -35
- package/client/SimpleConnector.js.flow +61 -61
- package/client/http.js.flow +60 -60
- package/client/licit.css +12 -12
- package/client/throttle.js.flow +27 -27
- package/convertFromDOMElement.js.flow +33 -33
- package/convertFromHTML.js.flow +15 -15
- package/convertFromJSON.js.flow +53 -53
- package/convertToCSSPTValue.js.flow +19 -19
- package/convertToJSON.js.flow +7 -7
- package/createCommand.js.flow +62 -62
- package/createEditorKeyMap.js.flow +87 -87
- package/createEmptyEditorState.js.flow +29 -29
- package/createTableResizingPlugin.js.flow +86 -86
- package/findActionableCell.js.flow +74 -74
- package/findActiveMark.js.flow +32 -32
- package/hyphenize.js.flow +17 -17
- package/index.d.ts +167 -167
- package/index.js.flow +10 -10
- package/insertTable.js.flow +54 -54
- package/isEditorStateEmpty.js.flow +32 -32
- package/isTableNode.js.flow +15 -15
- package/joinDown.js.flow +25 -25
- package/joinListNode.js.flow +55 -55
- package/joinUp.js.flow +37 -37
- package/keymaps.js.flow +175 -175
- package/lookUpElement.js.flow +14 -14
- package/nodeAt.js.flow +12 -12
- package/normalizeHTML.js.flow +80 -80
- package/package.json +152 -152
- package/patchAnchorElements.js.flow +38 -38
- package/patchBreakElements.js.flow +22 -22
- package/patchElementInlineStyles.js.flow +92 -92
- package/patchListElements.js.flow +275 -275
- package/patchMathElements.js.flow +58 -58
- package/patchParagraphElements.js.flow +20 -20
- package/patchStyleElements.js.flow +197 -197
- package/patchTableElements.js.flow +88 -88
- package/rebaseDocWithSteps.js.flow +42 -42
- package/sanitizeURL.js.flow +13 -13
- package/splitListItem.js.flow +191 -191
- package/styles.css +46 -46
- package/toClosestFontPtSize.js.flow +22 -22
- package/toSafeHTMLDocument.js.flow +9 -9
- package/toggleBlockquote.js.flow +101 -101
- package/toggleCodeBlock.js.flow +102 -102
- package/ui/AlertInfo.js.flow +63 -63
- package/ui/BookmarkNodeView.js.flow +64 -64
- package/ui/CommandButton.js.flow +68 -68
- package/ui/CommandMenu.js.flow +74 -74
- package/ui/CommandMenuButton.js.flow +128 -128
- package/ui/CustomEditorView.js.flow +29 -29
- package/ui/CustomMenu.js.flow +14 -14
- package/ui/CustomMenuItem.js.flow +35 -35
- package/ui/CustomNodeView.js.flow +207 -207
- package/ui/CustomRadioButton.js.flow +63 -63
- package/ui/DocLayoutEditor.js.flow +130 -130
- package/ui/Editor.js.flow +281 -281
- package/ui/EditorFrameset.js.flow +79 -79
- package/ui/EditorToolbar.js.flow +197 -197
- package/ui/EditorToolbarConfig.js.flow +162 -162
- package/ui/FontSizeCommandMenuButton.js.flow +66 -66
- package/ui/FontTypeCommandMenuButton.js.flow +60 -60
- package/ui/Frag.js.flow +11 -11
- package/ui/Icon.js +1 -1
- package/ui/Icon.js.flow +82 -82
- package/ui/ImageInlineEditor.js.flow +66 -66
- package/ui/KeyCodes.js.flow +12 -12
- package/ui/LinkTooltip.js.flow +51 -51
- package/ui/LinkURLEditor.js.flow +227 -227
- package/ui/ListItemNodeView.js.flow +101 -101
- package/ui/ListTypeButton.js.flow +121 -121
- package/ui/ListTypeCommandButton.js.flow +85 -85
- package/ui/ListTypeMenu.js.flow +78 -78
- package/ui/LoadingIndicator.js.flow +19 -19
- package/ui/PasteMenu.js.flow +52 -52
- package/ui/ResizeObserver.js.flow +105 -105
- package/ui/RichTextEditor.js.flow +133 -133
- package/ui/SelectionObserver.js.flow +134 -134
- package/ui/TableCellMenu.js.flow +49 -49
- package/ui/TableGridSizeEditor.js.flow +185 -185
- package/ui/TableNodeView.js.flow +36 -36
- package/ui/bindScrollHandler.js.flow +46 -46
- package/ui/canUseCSSFont.js.flow +42 -42
- package/ui/czi-body-layout-editor.css +16 -16
- package/ui/czi-bookmark-view.css +10 -10
- package/ui/czi-cursor-placeholder.css +36 -36
- package/ui/czi-custom-menu-button.css +18 -18
- package/ui/czi-custom-menu-item.css +30 -30
- package/ui/czi-custom-menu.css +8 -8
- package/ui/czi-custom-radio-button.css +80 -80
- package/ui/czi-custom-scrollbar.css +21 -21
- package/ui/czi-editor-frameset.css +81 -81
- package/ui/czi-editor-toolbar.css +122 -122
- package/ui/czi-editor.css +239 -216
- package/ui/czi-form.css +201 -201
- package/ui/czi-frag.css +3 -3
- package/ui/czi-heading.css +40 -40
- package/ui/czi-icon.css +72 -72
- package/ui/czi-image-resize-box.css +165 -165
- package/ui/czi-image-upload-editor.css +57 -57
- package/ui/czi-image-upload-placeholder.css +50 -50
- package/ui/czi-image-url-editor.css +38 -38
- package/ui/czi-image-view.css +121 -121
- package/ui/czi-indent.css +137 -137
- package/ui/czi-inline-editor.css +20 -20
- package/ui/czi-link-tooltip.css +112 -112
- package/ui/czi-list.css +406 -406
- package/ui/czi-loading-indicator.css +66 -66
- package/ui/czi-math-view.css +62 -62
- package/ui/czi-selection-placeholder.css +24 -24
- package/ui/czi-table-cell-menu.css +16 -16
- package/ui/czi-table-grid-size-editor.css +37 -37
- package/ui/czi-table.css +89 -89
- package/ui/czi-vars.css +47 -45
- package/ui/findActiveFontSize.js.flow +55 -55
- package/ui/findActiveFontType.js.flow +35 -35
- package/ui/fonts.css +460 -460
- package/ui/handleEditorDrop.js.flow +28 -28
- package/ui/handleEditorKeyDown.js.flow +39 -39
- package/ui/handleEditorPaste.js.flow +33 -33
- package/ui/htmlElementToRect.js.flow +18 -18
- package/ui/icon-font.css +9 -9
- package/ui/injectStyleSheet.js.flow +40 -40
- package/ui/isElementFullyVisible.js.flow +14 -14
- package/ui/isOffline.js.flow +8 -8
- package/ui/isReactClass.js.flow +12 -12
- package/ui/listType.css +21 -21
- package/ui/resolveImage.js.flow +121 -121
- package/ui/toCSSColor.js.flow +51 -51
- package/ui/toCSSLineSpacing.js.flow +53 -53
- package/ui/toHexColor.js.flow +26 -26
- package/ui/uuid.js.flow +9 -9
- package/uuid.js.flow +9 -9
|
@@ -1,86 +1,86 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
import { Plugin } from 'prosemirror-state';
|
|
4
|
-
import { columnResizing } from 'prosemirror-tables';
|
|
5
|
-
import { EditorView } from 'prosemirror-view';
|
|
6
|
-
|
|
7
|
-
const TABLE_HANDLE_WIDTH = 10;
|
|
8
|
-
const TABLE_CELL_MINWIDTH = 25;
|
|
9
|
-
const TABLE_VIEW = undefined;
|
|
10
|
-
const TABLE_LAST_COLUMN_RESIZABLE = false;
|
|
11
|
-
|
|
12
|
-
function lookUpTableWrapper(event: Event): ?HTMLElement {
|
|
13
|
-
const target: any = event.target;
|
|
14
|
-
if (!target?.closest) {
|
|
15
|
-
return null;
|
|
16
|
-
}
|
|
17
|
-
return target.closest('.tableWrapper');
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
function dispatchMouseEvent(type: string, clientX: number): void {
|
|
21
|
-
requestAnimationFrame(() => {
|
|
22
|
-
const event = new MouseEvent(type, {
|
|
23
|
-
view: window,
|
|
24
|
-
bubbles: true,
|
|
25
|
-
cancelable: true,
|
|
26
|
-
clientX,
|
|
27
|
-
});
|
|
28
|
-
window.dispatchEvent(event);
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
function calculateMaxClientX(
|
|
33
|
-
event: MouseEvent,
|
|
34
|
-
targetTable: HTMLElement
|
|
35
|
-
): number {
|
|
36
|
-
const { clientX } = event;
|
|
37
|
-
const { left, width } = targetTable.getBoundingClientRect();
|
|
38
|
-
const offsetX = clientX - left;
|
|
39
|
-
const colgroup = targetTable.querySelector('colgroup');
|
|
40
|
-
const colsCount = colgroup ? colgroup.querySelectorAll('col').length : 0;
|
|
41
|
-
const cx = width - offsetX - colsCount * TABLE_CELL_MINWIDTH;
|
|
42
|
-
return Math.round(clientX + Math.max(0, cx));
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export default function createTableResizingPlugin(): Plugin {
|
|
46
|
-
let maxClientX = 0;
|
|
47
|
-
|
|
48
|
-
// https://github.com/ProseMirror/prosemirror-tables/blob/master/src/columnresizing.js
|
|
49
|
-
const plugin = columnResizing(
|
|
50
|
-
TABLE_HANDLE_WIDTH,
|
|
51
|
-
TABLE_CELL_MINWIDTH,
|
|
52
|
-
TABLE_VIEW,
|
|
53
|
-
TABLE_LAST_COLUMN_RESIZABLE
|
|
54
|
-
);
|
|
55
|
-
|
|
56
|
-
const captureMouse = (event: any): void => {
|
|
57
|
-
if (event.clientX > maxClientX) {
|
|
58
|
-
// Current mouse event will make table too wide. Stop it and
|
|
59
|
-
// fires a simulated event instead.
|
|
60
|
-
event.stopImmediatePropagation();
|
|
61
|
-
dispatchMouseEvent(event.type, maxClientX);
|
|
62
|
-
} else if (event.type === 'mouseup') {
|
|
63
|
-
window.removeEventListener('mousemove', captureMouse, true);
|
|
64
|
-
window.removeEventListener('mouseup', captureMouse, true);
|
|
65
|
-
}
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
const { mousedown } = plugin.props.handleDOMEvents;
|
|
69
|
-
|
|
70
|
-
// This is a workaround to constraint the mousemove to prevent
|
|
71
|
-
// the table become too wide.
|
|
72
|
-
Object.assign(plugin.props.handleDOMEvents, {
|
|
73
|
-
mousedown(view: EditorView, event: MouseEvent): boolean {
|
|
74
|
-
const targetTable = lookUpTableWrapper(event);
|
|
75
|
-
maxClientX = targetTable
|
|
76
|
-
? calculateMaxClientX(event, targetTable)
|
|
77
|
-
: Number.MAX_VALUE;
|
|
78
|
-
window.addEventListener('mousemove', captureMouse, true);
|
|
79
|
-
window.addEventListener('mouseup', captureMouse, true);
|
|
80
|
-
mousedown(view, event);
|
|
81
|
-
return false;
|
|
82
|
-
},
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
return plugin;
|
|
86
|
-
}
|
|
1
|
+
// @flow
|
|
2
|
+
|
|
3
|
+
import { Plugin } from 'prosemirror-state';
|
|
4
|
+
import { columnResizing } from 'prosemirror-tables';
|
|
5
|
+
import { EditorView } from 'prosemirror-view';
|
|
6
|
+
|
|
7
|
+
const TABLE_HANDLE_WIDTH = 10;
|
|
8
|
+
const TABLE_CELL_MINWIDTH = 25;
|
|
9
|
+
const TABLE_VIEW = undefined;
|
|
10
|
+
const TABLE_LAST_COLUMN_RESIZABLE = false;
|
|
11
|
+
|
|
12
|
+
function lookUpTableWrapper(event: Event): ?HTMLElement {
|
|
13
|
+
const target: any = event.target;
|
|
14
|
+
if (!target?.closest) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
return target.closest('.tableWrapper');
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function dispatchMouseEvent(type: string, clientX: number): void {
|
|
21
|
+
requestAnimationFrame(() => {
|
|
22
|
+
const event = new MouseEvent(type, {
|
|
23
|
+
view: window,
|
|
24
|
+
bubbles: true,
|
|
25
|
+
cancelable: true,
|
|
26
|
+
clientX,
|
|
27
|
+
});
|
|
28
|
+
window.dispatchEvent(event);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function calculateMaxClientX(
|
|
33
|
+
event: MouseEvent,
|
|
34
|
+
targetTable: HTMLElement
|
|
35
|
+
): number {
|
|
36
|
+
const { clientX } = event;
|
|
37
|
+
const { left, width } = targetTable.getBoundingClientRect();
|
|
38
|
+
const offsetX = clientX - left;
|
|
39
|
+
const colgroup = targetTable.querySelector('colgroup');
|
|
40
|
+
const colsCount = colgroup ? colgroup.querySelectorAll('col').length : 0;
|
|
41
|
+
const cx = width - offsetX - colsCount * TABLE_CELL_MINWIDTH;
|
|
42
|
+
return Math.round(clientX + Math.max(0, cx));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export default function createTableResizingPlugin(): Plugin {
|
|
46
|
+
let maxClientX = 0;
|
|
47
|
+
|
|
48
|
+
// https://github.com/ProseMirror/prosemirror-tables/blob/master/src/columnresizing.js
|
|
49
|
+
const plugin = columnResizing(
|
|
50
|
+
TABLE_HANDLE_WIDTH,
|
|
51
|
+
TABLE_CELL_MINWIDTH,
|
|
52
|
+
TABLE_VIEW,
|
|
53
|
+
TABLE_LAST_COLUMN_RESIZABLE
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
const captureMouse = (event: any): void => {
|
|
57
|
+
if (event.clientX > maxClientX) {
|
|
58
|
+
// Current mouse event will make table too wide. Stop it and
|
|
59
|
+
// fires a simulated event instead.
|
|
60
|
+
event.stopImmediatePropagation();
|
|
61
|
+
dispatchMouseEvent(event.type, maxClientX);
|
|
62
|
+
} else if (event.type === 'mouseup') {
|
|
63
|
+
window.removeEventListener('mousemove', captureMouse, true);
|
|
64
|
+
window.removeEventListener('mouseup', captureMouse, true);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const { mousedown } = plugin.props.handleDOMEvents;
|
|
69
|
+
|
|
70
|
+
// This is a workaround to constraint the mousemove to prevent
|
|
71
|
+
// the table become too wide.
|
|
72
|
+
Object.assign(plugin.props.handleDOMEvents, {
|
|
73
|
+
mousedown(view: EditorView, event: MouseEvent): boolean {
|
|
74
|
+
const targetTable = lookUpTableWrapper(event);
|
|
75
|
+
maxClientX = targetTable
|
|
76
|
+
? calculateMaxClientX(event, targetTable)
|
|
77
|
+
: Number.MAX_VALUE;
|
|
78
|
+
window.addEventListener('mousemove', captureMouse, true);
|
|
79
|
+
window.addEventListener('mouseup', captureMouse, true);
|
|
80
|
+
mousedown(view, event);
|
|
81
|
+
return false;
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
return plugin;
|
|
86
|
+
}
|
|
@@ -1,74 +1,74 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
import { Node } from 'prosemirror-model';
|
|
4
|
-
import { EditorState, TextSelection } from 'prosemirror-state';
|
|
5
|
-
import { CellSelection, TableMap } from 'prosemirror-tables';
|
|
6
|
-
import { findParentNodeOfType } from 'prosemirror-utils';
|
|
7
|
-
|
|
8
|
-
import { TABLE_CELL, TABLE_HEADER } from './NodeNames.js';
|
|
9
|
-
|
|
10
|
-
type Result = {
|
|
11
|
-
node: Node,
|
|
12
|
-
pos: number,
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
function findActionableCellFromSelection(selection: CellSelection): ?Result {
|
|
16
|
-
const { $anchorCell } = selection;
|
|
17
|
-
const start = $anchorCell.start(-1);
|
|
18
|
-
const table = $anchorCell.node(-1);
|
|
19
|
-
const tableMap = TableMap.get(table);
|
|
20
|
-
let topRightRect;
|
|
21
|
-
let posFound = null;
|
|
22
|
-
let nodeFound = null;
|
|
23
|
-
selection.forEachCell((cell, cellPos) => {
|
|
24
|
-
const cellRect = tableMap.findCell(cellPos - start);
|
|
25
|
-
if (
|
|
26
|
-
!topRightRect ||
|
|
27
|
-
(cellRect.top >= topRightRect.top && cellRect.left > topRightRect.left)
|
|
28
|
-
) {
|
|
29
|
-
topRightRect = cellRect;
|
|
30
|
-
posFound = cellPos;
|
|
31
|
-
nodeFound = cell;
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
return posFound === null
|
|
36
|
-
? null
|
|
37
|
-
: {
|
|
38
|
-
node: nodeFound,
|
|
39
|
-
pos: posFound,
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export default function findActionableCell(state: EditorState): ?Result {
|
|
44
|
-
const { doc, selection, schema } = state;
|
|
45
|
-
const tdType = schema.nodes[TABLE_CELL];
|
|
46
|
-
const thType = schema.nodes[TABLE_HEADER];
|
|
47
|
-
if (!tdType && !thType) {
|
|
48
|
-
return null;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
let userSelection = selection;
|
|
52
|
-
|
|
53
|
-
if (userSelection instanceof TextSelection) {
|
|
54
|
-
const { from, to } = selection;
|
|
55
|
-
if (from !== to) {
|
|
56
|
-
return null;
|
|
57
|
-
}
|
|
58
|
-
const result =
|
|
59
|
-
(tdType && findParentNodeOfType(tdType)(selection)) ||
|
|
60
|
-
(thType && findParentNodeOfType(thType)(selection));
|
|
61
|
-
|
|
62
|
-
if (!result) {
|
|
63
|
-
return null;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
userSelection = CellSelection.create(doc, result.pos);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
if (userSelection instanceof CellSelection) {
|
|
70
|
-
return findActionableCellFromSelection(userSelection);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
return null;
|
|
74
|
-
}
|
|
1
|
+
// @flow
|
|
2
|
+
|
|
3
|
+
import { Node } from 'prosemirror-model';
|
|
4
|
+
import { EditorState, TextSelection } from 'prosemirror-state';
|
|
5
|
+
import { CellSelection, TableMap } from 'prosemirror-tables';
|
|
6
|
+
import { findParentNodeOfType } from 'prosemirror-utils';
|
|
7
|
+
|
|
8
|
+
import { TABLE_CELL, TABLE_HEADER } from './NodeNames.js';
|
|
9
|
+
|
|
10
|
+
type Result = {
|
|
11
|
+
node: Node,
|
|
12
|
+
pos: number,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
function findActionableCellFromSelection(selection: CellSelection): ?Result {
|
|
16
|
+
const { $anchorCell } = selection;
|
|
17
|
+
const start = $anchorCell.start(-1);
|
|
18
|
+
const table = $anchorCell.node(-1);
|
|
19
|
+
const tableMap = TableMap.get(table);
|
|
20
|
+
let topRightRect;
|
|
21
|
+
let posFound = null;
|
|
22
|
+
let nodeFound = null;
|
|
23
|
+
selection.forEachCell((cell, cellPos) => {
|
|
24
|
+
const cellRect = tableMap.findCell(cellPos - start);
|
|
25
|
+
if (
|
|
26
|
+
!topRightRect ||
|
|
27
|
+
(cellRect.top >= topRightRect.top && cellRect.left > topRightRect.left)
|
|
28
|
+
) {
|
|
29
|
+
topRightRect = cellRect;
|
|
30
|
+
posFound = cellPos;
|
|
31
|
+
nodeFound = cell;
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
return posFound === null
|
|
36
|
+
? null
|
|
37
|
+
: {
|
|
38
|
+
node: nodeFound,
|
|
39
|
+
pos: posFound,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export default function findActionableCell(state: EditorState): ?Result {
|
|
44
|
+
const { doc, selection, schema } = state;
|
|
45
|
+
const tdType = schema.nodes[TABLE_CELL];
|
|
46
|
+
const thType = schema.nodes[TABLE_HEADER];
|
|
47
|
+
if (!tdType && !thType) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
let userSelection = selection;
|
|
52
|
+
|
|
53
|
+
if (userSelection instanceof TextSelection) {
|
|
54
|
+
const { from, to } = selection;
|
|
55
|
+
if (from !== to) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
const result =
|
|
59
|
+
(tdType && findParentNodeOfType(tdType)(selection)) ||
|
|
60
|
+
(thType && findParentNodeOfType(thType)(selection));
|
|
61
|
+
|
|
62
|
+
if (!result) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
userSelection = CellSelection.create(doc, result.pos);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (userSelection instanceof CellSelection) {
|
|
70
|
+
return findActionableCellFromSelection(userSelection);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return null;
|
|
74
|
+
}
|
package/findActiveMark.js.flow
CHANGED
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
import { Mark, MarkType, Node } from 'prosemirror-model';
|
|
4
|
-
|
|
5
|
-
export default function findActiveMark(
|
|
6
|
-
doc: Node,
|
|
7
|
-
from: number,
|
|
8
|
-
to: number,
|
|
9
|
-
markType: MarkType
|
|
10
|
-
): ?Mark {
|
|
11
|
-
let ii = from;
|
|
12
|
-
if (doc.nodeSize <= 2) {
|
|
13
|
-
return null;
|
|
14
|
-
}
|
|
15
|
-
const finder = (mark) => mark.type === markType;
|
|
16
|
-
from = Math.max(2, from);
|
|
17
|
-
to = Math.min(to, doc.nodeSize - 2);
|
|
18
|
-
|
|
19
|
-
while (ii <= to) {
|
|
20
|
-
const node = doc.nodeAt(ii);
|
|
21
|
-
if (!node?.marks) {
|
|
22
|
-
ii++;
|
|
23
|
-
continue;
|
|
24
|
-
}
|
|
25
|
-
const mark = node.marks.find(finder);
|
|
26
|
-
if (mark) {
|
|
27
|
-
return mark;
|
|
28
|
-
}
|
|
29
|
-
ii++;
|
|
30
|
-
}
|
|
31
|
-
return null;
|
|
32
|
-
}
|
|
1
|
+
// @flow
|
|
2
|
+
|
|
3
|
+
import { Mark, MarkType, Node } from 'prosemirror-model';
|
|
4
|
+
|
|
5
|
+
export default function findActiveMark(
|
|
6
|
+
doc: Node,
|
|
7
|
+
from: number,
|
|
8
|
+
to: number,
|
|
9
|
+
markType: MarkType
|
|
10
|
+
): ?Mark {
|
|
11
|
+
let ii = from;
|
|
12
|
+
if (doc.nodeSize <= 2) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
const finder = (mark) => mark.type === markType;
|
|
16
|
+
from = Math.max(2, from);
|
|
17
|
+
to = Math.min(to, doc.nodeSize - 2);
|
|
18
|
+
|
|
19
|
+
while (ii <= to) {
|
|
20
|
+
const node = doc.nodeAt(ii);
|
|
21
|
+
if (!node?.marks) {
|
|
22
|
+
ii++;
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const mark = node.marks.find(finder);
|
|
26
|
+
if (mark) {
|
|
27
|
+
return mark;
|
|
28
|
+
}
|
|
29
|
+
ii++;
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
package/hyphenize.js.flow
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
function hadnleMatch(matched: string): string {
|
|
4
|
-
return matched[0] + '-' + matched[1].toLowerCase();
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
const cached = {};
|
|
8
|
-
|
|
9
|
-
// converts `fooBar` to `foo-bar`.
|
|
10
|
-
export default function hyphenize(str: string): string {
|
|
11
|
-
if (cached.hasOwnProperty(str)) {
|
|
12
|
-
return cached[str];
|
|
13
|
-
}
|
|
14
|
-
const result = str.replace(/[a-z][A-Z]/g, hadnleMatch);
|
|
15
|
-
cached[str] = result;
|
|
16
|
-
return result;
|
|
17
|
-
}
|
|
1
|
+
// @flow
|
|
2
|
+
|
|
3
|
+
function hadnleMatch(matched: string): string {
|
|
4
|
+
return matched[0] + '-' + matched[1].toLowerCase();
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
const cached = {};
|
|
8
|
+
|
|
9
|
+
// converts `fooBar` to `foo-bar`.
|
|
10
|
+
export default function hyphenize(str: string): string {
|
|
11
|
+
if (cached.hasOwnProperty(str)) {
|
|
12
|
+
return cached[str];
|
|
13
|
+
}
|
|
14
|
+
const result = str.replace(/[a-z][A-Z]/g, hadnleMatch);
|
|
15
|
+
cached[str] = result;
|
|
16
|
+
return result;
|
|
17
|
+
}
|