@modusoperandi/licit 1.0.3 → 1.0.5
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 +7 -8
- package/BlockquoteInsertNewLineCommand.js.flow +77 -77
- package/BlockquoteNodeSpec.js +1 -1
- package/BlockquoteNodeSpec.js.flow +30 -30
- package/BlockquoteToggleCommand.js +8 -9
- package/BlockquoteToggleCommand.js.flow +56 -56
- package/BookmarkNodeSpec.js +1 -1
- package/BookmarkNodeSpec.js.flow +39 -39
- package/BulletListNodeSpec.js.flow +61 -61
- package/CZIProseMirror.js.flow +90 -90
- package/CodeBlockCommand.js +8 -9
- package/CodeBlockCommand.js.flow +65 -65
- package/CodeBlockNodeSpec.js.flow +24 -24
- package/CodeMarkSpec.js.flow +14 -14
- package/ContentPlaceholderPlugin.js +3 -4
- package/ContentPlaceholderPlugin.js.flow +187 -187
- package/CursorPlaceholderPlugin.js +4 -4
- package/CursorPlaceholderPlugin.js.flow +115 -115
- package/DocLayoutCommand.js +9 -10
- package/DocLayoutCommand.js.flow +99 -99
- package/DocNodeSpec.js.flow +64 -64
- package/EMMarkSpec.js.flow +14 -14
- package/EditorCommands.js.flow +126 -126
- package/EditorKeyMap.js.flow +187 -187
- package/EditorMarks.js +1 -1
- package/EditorMarks.js.flow +71 -71
- package/EditorNodes.js +1 -1
- package/EditorNodes.js.flow +59 -59
- package/EditorPageLayoutPlugin.js +2 -2
- 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 +49 -49
- package/FontTypeMarkSpec.js.flow +80 -80
- package/HTMLMutator.js +2 -3
- package/HTMLMutator.js.flow +59 -59
- package/HardBreakNodeSpec.js.flow +15 -15
- package/HeadingNodeSpec.js +1 -1
- package/HeadingNodeSpec.js.flow +52 -52
- package/HistoryRedoCommand.js +7 -8
- package/HistoryRedoCommand.js.flow +41 -41
- package/HistoryUndoCommand.js +7 -8
- package/HistoryUndoCommand.js.flow +41 -41
- package/HorizontalRuleCommand.js +7 -8
- package/HorizontalRuleCommand.js.flow +71 -71
- package/HorizontalRuleNodeSpec.js.flow +39 -39
- package/ImageUploadPlaceholderPlugin.js +2 -2
- package/ImageUploadPlaceholderPlugin.js.flow +192 -192
- package/LinkMarkSpec.js.flow +32 -32
- package/LinkSetURLCommand.js +8 -9
- package/LinkSetURLCommand.js.flow +117 -117
- package/LinkTooltipPlugin.js +3 -4
- package/LinkTooltipPlugin.js.flow +190 -190
- package/ListItemInsertNewLineCommand.js +7 -8
- package/ListItemInsertNewLineCommand.js.flow +77 -77
- package/ListItemMergeCommand.js +9 -10
- package/ListItemMergeCommand.js.flow +199 -199
- package/ListItemNodeSpec.js.flow +52 -52
- package/ListSplitCommand.js +7 -8
- package/ListSplitCommand.js.flow +54 -54
- package/ListToggleCommand.js +11 -12
- package/ListToggleCommand.js.flow +99 -99
- package/MarkNames.js.flow +18 -18
- package/MarksClearCommand.js +9 -10
- package/MarksClearCommand.js.flow +65 -65
- package/MathEditCommand.js +8 -9
- package/MathEditCommand.js.flow +120 -120
- package/MathNodeSpec.js.flow +46 -46
- package/NodeNames.js.flow +23 -23
- package/OrderedListNodeSpec.js +1 -1
- package/OrderedListNodeSpec.js.flow +132 -132
- package/ParagraphNodeSpec.js.flow +156 -156
- package/ParagraphSpacingCommand.js +9 -10
- package/ParagraphSpacingCommand.js.flow +144 -144
- package/PrintCommand.js +9 -10
- package/PrintCommand.js.flow +53 -53
- package/SelectionPlaceholderPlugin.js +4 -4
- package/SelectionPlaceholderPlugin.js.flow +131 -131
- package/SpacerMarkSpec.js +1 -1
- package/SpacerMarkSpec.js.flow +47 -47
- package/StrikeMarkSpec.js.flow +21 -21
- package/StrongMarkSpec.js.flow +25 -25
- package/StyleView.js +2 -3
- package/StyleView.js.flow +19 -19
- package/TableBackgroundColorCommand.js +25 -12
- package/TableBackgroundColorCommand.js.flow +83 -75
- package/TableBorderColorCommand.js +25 -12
- package/TableBorderColorCommand.js.flow +86 -75
- package/TableCellColorCommand.js +11 -11
- package/TableCellColorCommand.js.flow +75 -75
- package/TableCellMenuPlugin.js +3 -4
- package/TableCellMenuPlugin.js.flow +132 -132
- package/TableInsertCommand.js +9 -10
- package/TableInsertCommand.js.flow +120 -120
- package/TableMergeCellsCommand.js +7 -8
- package/TableMergeCellsCommand.js.flow +112 -112
- package/TableNodesSpecs.js.flow +78 -78
- package/TablePlugins.js.flow +14 -14
- package/TableResizePlugin.js +6 -6
- package/TableResizePlugin.js.flow +631 -632
- package/TextColorMarkSpec.js.flow +35 -35
- package/TextHighlightMarkSpec.js.flow +38 -38
- package/TextInsertTabSpaceCommand.js +7 -8
- package/TextInsertTabSpaceCommand.js.flow +106 -106
- package/TextNoWrapMarkSpec.js.flow +14 -14
- package/TextNodeSpec.js.flow +7 -7
- package/TextSelectionMarkSpec.js.flow +24 -24
- package/TextSubMarkSpec.js.flow +20 -20
- package/TextSuperMarkSpec.js.flow +20 -20
- package/TextUnderlineMarkSpec.js.flow +27 -27
- package/Types.js +5 -0
- package/Types.js.flow +80 -75
- package/WebFontLoader.js +2 -3
- package/WebFontLoader.js.flow +22 -22
- package/blockQuoteInputRule.js.flow +36 -36
- package/bom.xml +8533 -8895
- package/browser.js.flow +7 -7
- package/buildEditorPlugins.js +2 -3
- package/buildEditorPlugins.js.flow +49 -49
- package/buildInputRules.js.flow +81 -81
- package/client/CollabConnector.js +12 -12
- package/client/CollabConnector.js.flow +90 -90
- package/client/EditorConnection.js +2 -3
- package/client/EditorConnection.js.flow +323 -323
- package/client/Licit.js +59 -60
- package/client/Licit.js.flow +643 -643
- package/client/Licit.test.js +2 -2
- package/client/Licit.test.js.flow +98 -98
- package/client/Reporter.js +2 -3
- package/client/Reporter.js.flow +37 -37
- package/client/SimpleConnector.js +1 -1
- package/client/SimpleConnector.js.flow +61 -61
- package/client/http.js.flow +70 -70
- package/client/licit.css +12 -12
- package/client/throttle.js.flow +27 -27
- package/convertFromDOMElement.js.flow +36 -36
- package/convertFromHTML.js.flow +17 -17
- package/convertFromJSON.js.flow +56 -56
- package/convertToCSSPTValue.js.flow +22 -22
- package/convertToJSON.js.flow +7 -7
- package/createCommand.js +8 -9
- package/createCommand.js.flow +62 -62
- package/createEditorKeyMap.js +1 -1
- package/createEditorKeyMap.js.flow +94 -94
- package/createEmptyEditorState.js.flow +31 -31
- 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 +165 -165
- package/index.js.flow +10 -10
- package/insertTable.js.flow +56 -56
- package/isEditorStateEmpty.js.flow +32 -32
- package/isTableNode.js.flow +15 -15
- package/joinDown.js.flow +27 -27
- package/joinListNode.js.flow +55 -55
- package/joinUp.js.flow +39 -39
- package/keymaps.js.flow +185 -185
- package/lookUpElement.js.flow +14 -14
- package/nodeAt.js.flow +12 -12
- package/normalizeHTML.js.flow +78 -78
- package/package.json +156 -155
- package/patchAnchorElements.js.flow +38 -38
- package/patchBreakElements.js.flow +22 -22
- package/patchElementInlineStyles.js.flow +92 -92
- package/patchListElements.js.flow +276 -276
- package/patchMathElements.js.flow +60 -60
- package/patchParagraphElements.js.flow +20 -20
- package/patchStyleElements.js.flow +196 -196
- package/patchTableElements.js.flow +89 -89
- package/rebaseDocWithSteps.js.flow +42 -42
- package/sanitizeURL.js.flow +13 -13
- package/splitListItem.js +1 -1
- package/splitListItem.js.flow +191 -191
- package/styles.css +19 -19
- package/styles0.css +29 -29
- package/toClosestFontPtSize.js.flow +22 -22
- package/toSafeHTMLDocument.js.flow +9 -9
- package/toggleBlockquote.js.flow +108 -108
- package/toggleCodeBlock.js.flow +102 -102
- package/ui/AlertInfo.js +7 -8
- package/ui/AlertInfo.js.flow +64 -64
- package/ui/BookmarkNodeView.js +8 -10
- package/ui/BookmarkNodeView.js.flow +66 -66
- package/ui/CommandButton.js +7 -8
- package/ui/CommandButton.js.flow +68 -68
- package/ui/CommandMenu.js +8 -9
- package/ui/CommandMenu.js.flow +75 -75
- package/ui/CommandMenuButton.js +13 -14
- package/ui/CommandMenuButton.js.flow +131 -131
- package/ui/CustomEditorView.js +8 -9
- package/ui/CustomEditorView.js.flow +28 -28
- package/ui/CustomMenu.js +3 -4
- package/ui/CustomMenu.js.flow +17 -17
- package/ui/CustomMenuItem.js +6 -8
- package/ui/CustomMenuItem.js.flow +36 -36
- package/ui/CustomNodeView.js +2 -3
- package/ui/CustomNodeView.js.flow +200 -200
- package/ui/CustomRadioButton.js +6 -7
- package/ui/CustomRadioButton.js.flow +65 -65
- package/ui/DocLayoutEditor.js +9 -10
- package/ui/DocLayoutEditor.js.flow +146 -146
- package/ui/Editor.js +15 -16
- package/ui/Editor.js.flow +288 -288
- package/ui/EditorFrameset.js +5 -6
- package/ui/EditorFrameset.js.flow +81 -81
- package/ui/EditorToolbar.js +13 -14
- package/ui/EditorToolbar.js.flow +218 -218
- package/ui/EditorToolbarConfig.js.flow +164 -164
- package/ui/FontSizeCommandMenuButton.js +5 -6
- package/ui/FontSizeCommandMenuButton.js.flow +66 -66
- package/ui/FontTypeCommandMenuButton.js +5 -6
- package/ui/FontTypeCommandMenuButton.js.flow +61 -61
- package/ui/Frag.js +3 -4
- package/ui/Frag.js.flow +13 -13
- package/ui/Icon.js +9 -12
- package/ui/Icon.js.flow +89 -89
- package/ui/ImageInlineEditor.js +6 -7
- package/ui/ImageInlineEditor.js.flow +67 -67
- package/ui/KeyCodes.js.flow +12 -12
- package/ui/LinkTooltip.js +9 -10
- package/ui/LinkTooltip.js.flow +85 -85
- package/ui/LinkURLEditor.js +9 -10
- package/ui/LinkURLEditor.js.flow +117 -117
- package/ui/ListItemNodeView.js +2 -3
- package/ui/ListItemNodeView.js.flow +98 -98
- package/ui/ListTypeButton.js +13 -14
- package/ui/ListTypeButton.js.flow +131 -131
- package/ui/ListTypeCommandButton.js +5 -6
- package/ui/ListTypeCommandButton.js.flow +85 -85
- package/ui/ListTypeMenu.js +11 -12
- package/ui/ListTypeMenu.js.flow +70 -70
- package/ui/LoadingIndicator.js +3 -4
- package/ui/LoadingIndicator.js.flow +20 -20
- package/ui/MathEditor.js +10 -11
- package/ui/MathEditor.js.flow +78 -78
- package/ui/MathInlineEditor.js +8 -9
- package/ui/MathInlineEditor.js.flow +102 -102
- package/ui/MathNodeView.js +14 -16
- package/ui/MathNodeView.js.flow +186 -186
- package/ui/PasteMenu.js +10 -11
- package/ui/PasteMenu.js.flow +57 -57
- package/ui/ResizeObserver.js.flow +106 -106
- package/ui/RichTextEditor.js +9 -10
- package/ui/RichTextEditor.js.flow +133 -133
- package/ui/SelectionObserver.js +2 -3
- package/ui/SelectionObserver.js.flow +134 -134
- package/ui/TableCellMenu.js +6 -7
- package/ui/TableCellMenu.js.flow +51 -51
- package/ui/TableGridSizeEditor.js +19 -21
- package/ui/TableGridSizeEditor.js.flow +184 -184
- package/ui/TableNodeView.js +3 -4
- package/ui/TableNodeView.js.flow +25 -25
- package/ui/bindScrollHandler.js.flow +46 -46
- package/ui/canUseCSSFont.js.flow +43 -43
- 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 +220 -220
- package/ui/czi-form.css +107 -107
- 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 +125 -125
- package/ui/czi-indent.css +137 -137
- package/ui/czi-inline-editor.css +20 -20
- package/ui/czi-link-tooltip.css +71 -71
- package/ui/czi-list.css +410 -410
- package/ui/czi-loading-indicator.css +111 -111
- package/ui/czi-math-view.css +62 -62
- package/ui/czi-selection-placeholder.css +24 -24
- package/ui/czi-table-cell-menu.css +14 -14
- package/ui/czi-table-grid-size-editor.css +37 -37
- package/ui/czi-table.css +87 -87
- package/ui/czi-vars.css +2 -2
- package/ui/findActiveFontSize.js.flow +58 -58
- package/ui/findActiveFontType.js.flow +38 -38
- 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 +42 -42
- package/ui/isElementFullyVisible.js.flow +26 -26
- package/ui/isOffline.js.flow +8 -8
- package/ui/isReactClass.js.flow +12 -12
- package/ui/listType.css +21 -21
- package/ui/mathquill-editor/MathQuillEditor.js +15 -17
- package/ui/mathquill-editor/MathQuillEditor.js.flow +159 -159
- package/ui/mathquill-editor/MathQuillEditorSymbols.js.flow +483 -483
- package/ui/mathquill-editor/MathQuillEditorSymbolsPanel.js +6 -7
- package/ui/mathquill-editor/MathQuillEditorSymbolsPanel.js.flow +50 -50
- package/ui/mathquill-editor/czi-mathquill-editor-symbols-panel.css +39 -39
- package/ui/mathquill-editor/czi-mathquill-editor.css +50 -50
- package/ui/mathquill-editor/mathquill-import-kludge.js.flow +24 -24
- package/ui/renderLaTeXAsHTML.js +1 -1
- package/ui/renderLaTeXAsHTML.js.flow +46 -46
- package/ui/resolveImage.js +1 -1
- package/ui/resolveImage.js.flow +123 -123
- package/ui/toCSSColor.js.flow +51 -51
- package/ui/toCSSLineSpacing.js.flow +55 -55
- package/ui/toHexColor.js.flow +26 -26
- package/ui/uuid.js.flow +9 -9
- package/uuid.js.flow +9 -9
|
@@ -1,156 +1,156 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
import convertToCSSPTValue from './convertToCSSPTValue.js';
|
|
4
|
-
import toCSSLineSpacing from './ui/toCSSLineSpacing.js';
|
|
5
|
-
import { Node } from 'prosemirror-model';
|
|
6
|
-
|
|
7
|
-
import type { NodeSpec } from './Types.js';
|
|
8
|
-
|
|
9
|
-
// This assumes that every 36pt maps to one indent level.
|
|
10
|
-
export const INDENT_MARGIN_PT_SIZE = 36;
|
|
11
|
-
export const MIN_INDENT_LEVEL = 0;
|
|
12
|
-
export const MAX_INDENT_LEVEL = 7;
|
|
13
|
-
export const ATTRIBUTE_INDENT = 'data-indent';
|
|
14
|
-
export const ATTRIBUTE_STYLE_LEVEL = 'data-style-level';
|
|
15
|
-
export const RESERVED_STYLE_NONE = 'None';
|
|
16
|
-
export const RESERVED_STYLE_NONE_NUMBERING = RESERVED_STYLE_NONE + '-@#$-';
|
|
17
|
-
const cssVal = new Set(['', '0%', '0pt', '0px']);
|
|
18
|
-
|
|
19
|
-
export const EMPTY_CSS_VALUE = cssVal;
|
|
20
|
-
|
|
21
|
-
const ALIGN_PATTERN = /(left|right|center|justify)/;
|
|
22
|
-
|
|
23
|
-
// https://github.com/ProseMirror/prosemirror-schema-basic/blob/master/src/schema-basic.js
|
|
24
|
-
// :: NodeSpec A plain paragraph textblock. Represented in the DOM
|
|
25
|
-
// as a `<p>` element.
|
|
26
|
-
const ParagraphNodeSpec: NodeSpec = {
|
|
27
|
-
attrs: {
|
|
28
|
-
align: {
|
|
29
|
-
default: null,
|
|
30
|
-
},
|
|
31
|
-
color: {
|
|
32
|
-
default: null,
|
|
33
|
-
},
|
|
34
|
-
id: {
|
|
35
|
-
default: null,
|
|
36
|
-
},
|
|
37
|
-
indent: {
|
|
38
|
-
default: null,
|
|
39
|
-
},
|
|
40
|
-
lineSpacing: {
|
|
41
|
-
default: null,
|
|
42
|
-
},
|
|
43
|
-
// TODO: Add UI to let user edit / clear padding.
|
|
44
|
-
paddingBottom: {
|
|
45
|
-
default: null,
|
|
46
|
-
},
|
|
47
|
-
// TODO: Add UI to let user edit / clear padding.
|
|
48
|
-
paddingTop: {
|
|
49
|
-
default: null,
|
|
50
|
-
},
|
|
51
|
-
},
|
|
52
|
-
content: 'inline*',
|
|
53
|
-
group: 'block',
|
|
54
|
-
parseDOM: [
|
|
55
|
-
{
|
|
56
|
-
tag: 'p',
|
|
57
|
-
getAttrs,
|
|
58
|
-
},
|
|
59
|
-
],
|
|
60
|
-
toDOM,
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
function getAttrs(dom: HTMLElement): Object {
|
|
64
|
-
const {
|
|
65
|
-
lineHeight,
|
|
66
|
-
textAlign,
|
|
67
|
-
marginLeft,
|
|
68
|
-
paddingTop,
|
|
69
|
-
paddingBottom,
|
|
70
|
-
} = dom.style;
|
|
71
|
-
|
|
72
|
-
let align = dom.getAttribute('align') || textAlign || '';
|
|
73
|
-
align = ALIGN_PATTERN.test(align) ? align : null;
|
|
74
|
-
|
|
75
|
-
let indent = parseInt(dom.getAttribute(ATTRIBUTE_INDENT), 10);
|
|
76
|
-
|
|
77
|
-
if (!indent && marginLeft) {
|
|
78
|
-
indent = convertMarginLeftToIndentValue(marginLeft);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
indent = indent || MIN_INDENT_LEVEL;
|
|
82
|
-
|
|
83
|
-
const lineSpacing = lineHeight ? toCSSLineSpacing(lineHeight) : null;
|
|
84
|
-
|
|
85
|
-
const id = dom.getAttribute('id') || '';
|
|
86
|
-
return {
|
|
87
|
-
align,
|
|
88
|
-
indent,
|
|
89
|
-
lineSpacing,
|
|
90
|
-
paddingTop,
|
|
91
|
-
paddingBottom,
|
|
92
|
-
id,
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
function getStyle(attrs: Object) {
|
|
97
|
-
return getStyleEx(
|
|
98
|
-
attrs.align,
|
|
99
|
-
attrs.lineSpacing,
|
|
100
|
-
attrs.paddingTop,
|
|
101
|
-
attrs.paddingBottom,
|
|
102
|
-
);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
function getStyleEx(align, lineSpacing, paddingTop, paddingBottom) {
|
|
106
|
-
let style = '';
|
|
107
|
-
if (align && align !== 'left') {
|
|
108
|
-
style += `text-align: ${align};`;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
if (lineSpacing) {
|
|
112
|
-
const cssLineSpacing = toCSSLineSpacing(lineSpacing);
|
|
113
|
-
style +=
|
|
114
|
-
`line-height: ${cssLineSpacing};` +
|
|
115
|
-
// This creates the local css variable `--czi-content-line-height`
|
|
116
|
-
// that its children may apply.
|
|
117
|
-
`--czi-content-line-height: ${cssLineSpacing};`;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
if (paddingTop && !EMPTY_CSS_VALUE.has(paddingTop)) {
|
|
121
|
-
style += `padding-top: ${paddingTop};`;
|
|
122
|
-
}
|
|
123
|
-
if (paddingBottom && !EMPTY_CSS_VALUE.has(paddingBottom)) {
|
|
124
|
-
style += `padding-bottom: ${paddingBottom};`;
|
|
125
|
-
}
|
|
126
|
-
return { style };
|
|
127
|
-
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
function toDOM(node: Node): Array<any> {
|
|
131
|
-
const { indent, id } = node.attrs;
|
|
132
|
-
const attrs = {};
|
|
133
|
-
const { style } = getStyle(node.attrs);
|
|
134
|
-
|
|
135
|
-
style && (attrs.style = style);
|
|
136
|
-
|
|
137
|
-
if (indent) {
|
|
138
|
-
attrs[ATTRIBUTE_INDENT] = String(indent);
|
|
139
|
-
}
|
|
140
|
-
if (id) {
|
|
141
|
-
attrs.id = id;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
return ['p', attrs, 0];
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
export const toParagraphDOM = toDOM;
|
|
148
|
-
export const getParagraphNodeAttrs = getAttrs;
|
|
149
|
-
export const getParagraphStyle = getStyle;
|
|
150
|
-
|
|
151
|
-
export function convertMarginLeftToIndentValue(marginLeft: string): number {
|
|
152
|
-
const ptValue = convertToCSSPTValue(marginLeft);
|
|
153
|
-
return Math.min(Math.max(Math.floor(ptValue / INDENT_MARGIN_PT_SIZE), MIN_INDENT_LEVEL), MAX_INDENT_LEVEL);
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
export default ParagraphNodeSpec;
|
|
1
|
+
// @flow
|
|
2
|
+
|
|
3
|
+
import convertToCSSPTValue from './convertToCSSPTValue.js';
|
|
4
|
+
import toCSSLineSpacing from './ui/toCSSLineSpacing.js';
|
|
5
|
+
import { Node } from 'prosemirror-model';
|
|
6
|
+
|
|
7
|
+
import type { NodeSpec } from './Types.js';
|
|
8
|
+
|
|
9
|
+
// This assumes that every 36pt maps to one indent level.
|
|
10
|
+
export const INDENT_MARGIN_PT_SIZE = 36;
|
|
11
|
+
export const MIN_INDENT_LEVEL = 0;
|
|
12
|
+
export const MAX_INDENT_LEVEL = 7;
|
|
13
|
+
export const ATTRIBUTE_INDENT = 'data-indent';
|
|
14
|
+
export const ATTRIBUTE_STYLE_LEVEL = 'data-style-level';
|
|
15
|
+
export const RESERVED_STYLE_NONE = 'None';
|
|
16
|
+
export const RESERVED_STYLE_NONE_NUMBERING = RESERVED_STYLE_NONE + '-@#$-';
|
|
17
|
+
const cssVal = new Set(['', '0%', '0pt', '0px']);
|
|
18
|
+
|
|
19
|
+
export const EMPTY_CSS_VALUE = cssVal;
|
|
20
|
+
|
|
21
|
+
const ALIGN_PATTERN = /(left|right|center|justify)/;
|
|
22
|
+
|
|
23
|
+
// https://github.com/ProseMirror/prosemirror-schema-basic/blob/master/src/schema-basic.js
|
|
24
|
+
// :: NodeSpec A plain paragraph textblock. Represented in the DOM
|
|
25
|
+
// as a `<p>` element.
|
|
26
|
+
const ParagraphNodeSpec: NodeSpec = {
|
|
27
|
+
attrs: {
|
|
28
|
+
align: {
|
|
29
|
+
default: null,
|
|
30
|
+
},
|
|
31
|
+
color: {
|
|
32
|
+
default: null,
|
|
33
|
+
},
|
|
34
|
+
id: {
|
|
35
|
+
default: null,
|
|
36
|
+
},
|
|
37
|
+
indent: {
|
|
38
|
+
default: null,
|
|
39
|
+
},
|
|
40
|
+
lineSpacing: {
|
|
41
|
+
default: null,
|
|
42
|
+
},
|
|
43
|
+
// TODO: Add UI to let user edit / clear padding.
|
|
44
|
+
paddingBottom: {
|
|
45
|
+
default: null,
|
|
46
|
+
},
|
|
47
|
+
// TODO: Add UI to let user edit / clear padding.
|
|
48
|
+
paddingTop: {
|
|
49
|
+
default: null,
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
content: 'inline*',
|
|
53
|
+
group: 'block',
|
|
54
|
+
parseDOM: [
|
|
55
|
+
{
|
|
56
|
+
tag: 'p',
|
|
57
|
+
getAttrs,
|
|
58
|
+
},
|
|
59
|
+
],
|
|
60
|
+
toDOM,
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
function getAttrs(dom: HTMLElement): Object {
|
|
64
|
+
const {
|
|
65
|
+
lineHeight,
|
|
66
|
+
textAlign,
|
|
67
|
+
marginLeft,
|
|
68
|
+
paddingTop,
|
|
69
|
+
paddingBottom,
|
|
70
|
+
} = dom.style;
|
|
71
|
+
|
|
72
|
+
let align = dom.getAttribute('align') || textAlign || '';
|
|
73
|
+
align = ALIGN_PATTERN.test(align) ? align : null;
|
|
74
|
+
|
|
75
|
+
let indent = parseInt(dom.getAttribute(ATTRIBUTE_INDENT), 10);
|
|
76
|
+
|
|
77
|
+
if (!indent && marginLeft) {
|
|
78
|
+
indent = convertMarginLeftToIndentValue(marginLeft);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
indent = indent || MIN_INDENT_LEVEL;
|
|
82
|
+
|
|
83
|
+
const lineSpacing = lineHeight ? toCSSLineSpacing(lineHeight) : null;
|
|
84
|
+
|
|
85
|
+
const id = dom.getAttribute('id') || '';
|
|
86
|
+
return {
|
|
87
|
+
align,
|
|
88
|
+
indent,
|
|
89
|
+
lineSpacing,
|
|
90
|
+
paddingTop,
|
|
91
|
+
paddingBottom,
|
|
92
|
+
id,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function getStyle(attrs: Object) {
|
|
97
|
+
return getStyleEx(
|
|
98
|
+
attrs.align,
|
|
99
|
+
attrs.lineSpacing,
|
|
100
|
+
attrs.paddingTop,
|
|
101
|
+
attrs.paddingBottom,
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function getStyleEx(align, lineSpacing, paddingTop, paddingBottom) {
|
|
106
|
+
let style = '';
|
|
107
|
+
if (align && align !== 'left') {
|
|
108
|
+
style += `text-align: ${align};`;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (lineSpacing) {
|
|
112
|
+
const cssLineSpacing = toCSSLineSpacing(lineSpacing);
|
|
113
|
+
style +=
|
|
114
|
+
`line-height: ${cssLineSpacing};` +
|
|
115
|
+
// This creates the local css variable `--czi-content-line-height`
|
|
116
|
+
// that its children may apply.
|
|
117
|
+
`--czi-content-line-height: ${cssLineSpacing};`;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (paddingTop && !EMPTY_CSS_VALUE.has(paddingTop)) {
|
|
121
|
+
style += `padding-top: ${paddingTop};`;
|
|
122
|
+
}
|
|
123
|
+
if (paddingBottom && !EMPTY_CSS_VALUE.has(paddingBottom)) {
|
|
124
|
+
style += `padding-bottom: ${paddingBottom};`;
|
|
125
|
+
}
|
|
126
|
+
return { style };
|
|
127
|
+
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function toDOM(node: Node): Array<any> {
|
|
131
|
+
const { indent, id } = node.attrs;
|
|
132
|
+
const attrs = {};
|
|
133
|
+
const { style } = getStyle(node.attrs);
|
|
134
|
+
|
|
135
|
+
style && (attrs.style = style);
|
|
136
|
+
|
|
137
|
+
if (indent) {
|
|
138
|
+
attrs[ATTRIBUTE_INDENT] = String(indent);
|
|
139
|
+
}
|
|
140
|
+
if (id) {
|
|
141
|
+
attrs.id = id;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return ['p', attrs, 0];
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export const toParagraphDOM = toDOM;
|
|
148
|
+
export const getParagraphNodeAttrs = getAttrs;
|
|
149
|
+
export const getParagraphStyle = getStyle;
|
|
150
|
+
|
|
151
|
+
export function convertMarginLeftToIndentValue(marginLeft: string): number {
|
|
152
|
+
const ptValue = convertToCSSPTValue(marginLeft);
|
|
153
|
+
return Math.min(Math.max(Math.floor(ptValue / INDENT_MARGIN_PT_SIZE), MIN_INDENT_LEVEL), MAX_INDENT_LEVEL);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export default ParagraphNodeSpec;
|
|
@@ -4,15 +4,15 @@ function _defineProperties(target, props) { for (var i = 0; i < props.length; i+
|
|
|
4
4
|
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
5
5
|
function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
|
|
6
6
|
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
|
|
7
|
+
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
|
7
8
|
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
8
9
|
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
|
|
9
|
-
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
|
10
10
|
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
|
|
11
11
|
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
12
12
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
13
13
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
14
14
|
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
15
|
-
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i :
|
|
15
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
16
16
|
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
17
17
|
import { UICommand } from '@modusoperandi/licit-doc-attrs-step';
|
|
18
18
|
import { AllSelection, TextSelection } from 'prosemirror-state';
|
|
@@ -80,14 +80,13 @@ export function setParagraphSpacing(tr, schema, paragraphSpacing, isAfter) {
|
|
|
80
80
|
return tr;
|
|
81
81
|
}
|
|
82
82
|
var ParagraphSpacingCommand = /*#__PURE__*/function (_UICommand) {
|
|
83
|
-
_inherits(ParagraphSpacingCommand, _UICommand);
|
|
84
83
|
function ParagraphSpacingCommand(paragraphSpacing, isAfter) {
|
|
85
84
|
var _this;
|
|
86
85
|
_classCallCheck(this, ParagraphSpacingCommand);
|
|
87
86
|
_this = _callSuper(this, ParagraphSpacingCommand);
|
|
88
|
-
_defineProperty(
|
|
89
|
-
_defineProperty(
|
|
90
|
-
_defineProperty(
|
|
87
|
+
_defineProperty(_this, "_paragraphSpacing", void 0);
|
|
88
|
+
_defineProperty(_this, "_isAfter", void 0);
|
|
89
|
+
_defineProperty(_this, "execute", function (state, dispatch, view) {
|
|
91
90
|
var schema = state.schema,
|
|
92
91
|
selection = state.selection;
|
|
93
92
|
var tr = setParagraphSpacing(state.tr.setSelection(selection), schema, _this._paragraphSpacing, _this._isAfter);
|
|
@@ -98,22 +97,22 @@ var ParagraphSpacingCommand = /*#__PURE__*/function (_UICommand) {
|
|
|
98
97
|
return false;
|
|
99
98
|
}
|
|
100
99
|
});
|
|
101
|
-
_defineProperty(
|
|
100
|
+
_defineProperty(_this, "waitForUserInput", function (_state, _dispatch, _view, _event) {
|
|
102
101
|
return Promise.resolve(undefined);
|
|
103
102
|
});
|
|
104
|
-
_defineProperty(
|
|
103
|
+
_defineProperty(_this, "executeWithUserInput", function (_state, _dispatch, _view, _inputs) {
|
|
105
104
|
return false;
|
|
106
105
|
});
|
|
107
106
|
_this._paragraphSpacing = paragraphSpacing;
|
|
108
107
|
_this._isAfter = isAfter;
|
|
109
108
|
return _this;
|
|
110
109
|
}
|
|
111
|
-
|
|
110
|
+
_inherits(ParagraphSpacingCommand, _UICommand);
|
|
111
|
+
return _createClass(ParagraphSpacingCommand, [{
|
|
112
112
|
key: "cancel",
|
|
113
113
|
value: function cancel() {
|
|
114
114
|
return null;
|
|
115
115
|
}
|
|
116
116
|
}]);
|
|
117
|
-
return ParagraphSpacingCommand;
|
|
118
117
|
}(UICommand);
|
|
119
118
|
export default ParagraphSpacingCommand;
|
|
@@ -1,144 +1,144 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
import { UICommand } from '@modusoperandi/licit-doc-attrs-step';
|
|
4
|
-
import { AllSelection, TextSelection } from 'prosemirror-state';
|
|
5
|
-
import { BLOCKQUOTE, HEADING, LIST_ITEM, PARAGRAPH } from './NodeNames';
|
|
6
|
-
import { EditorState } from 'prosemirror-state';
|
|
7
|
-
import { EditorView } from 'prosemirror-view';
|
|
8
|
-
import { Schema } from 'prosemirror-model';
|
|
9
|
-
import { Transform } from 'prosemirror-transform';
|
|
10
|
-
import * as React from 'react';
|
|
11
|
-
|
|
12
|
-
export function setParagraphSpacing(
|
|
13
|
-
tr: Transform,
|
|
14
|
-
schema: Schema,
|
|
15
|
-
paragraphSpacing: ?string,
|
|
16
|
-
isAfter: ?boolean
|
|
17
|
-
): Transform {
|
|
18
|
-
const { selection, doc } = tr;
|
|
19
|
-
if (!selection || !doc) {
|
|
20
|
-
return tr;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
if (
|
|
24
|
-
!(selection instanceof TextSelection) &&
|
|
25
|
-
!(selection instanceof AllSelection)
|
|
26
|
-
) {
|
|
27
|
-
return tr;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const { from, to } = selection;
|
|
31
|
-
const paragraph = schema.nodes[PARAGRAPH];
|
|
32
|
-
const heading = schema.nodes[HEADING];
|
|
33
|
-
const listItem = schema.nodes[LIST_ITEM];
|
|
34
|
-
const blockquote = schema.nodes[BLOCKQUOTE];
|
|
35
|
-
if (!paragraph && !heading && !listItem && !blockquote) {
|
|
36
|
-
return tr;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
const tasks = [];
|
|
40
|
-
const paragraphSpacingValue = paragraphSpacing || null;
|
|
41
|
-
|
|
42
|
-
doc.nodesBetween(from, to, (node, pos, parentNode) => {
|
|
43
|
-
const nodeType = node.type;
|
|
44
|
-
if (
|
|
45
|
-
nodeType === paragraph ||
|
|
46
|
-
nodeType === heading ||
|
|
47
|
-
nodeType === listItem ||
|
|
48
|
-
nodeType === blockquote
|
|
49
|
-
) {
|
|
50
|
-
const paragraphSpacing = node.attrs.paragraphSpacing || null;
|
|
51
|
-
if (paragraphSpacing !== paragraphSpacingValue) {
|
|
52
|
-
tasks.push({
|
|
53
|
-
node,
|
|
54
|
-
pos,
|
|
55
|
-
nodeType,
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
return nodeType === listItem ? true : false;
|
|
59
|
-
}
|
|
60
|
-
return true;
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
if (!tasks.length) {
|
|
64
|
-
return tr;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
tasks.forEach((job) => {
|
|
68
|
-
const { node, pos, nodeType } = job;
|
|
69
|
-
let { attrs } = node;
|
|
70
|
-
if (isAfter) {
|
|
71
|
-
attrs = {
|
|
72
|
-
...attrs,
|
|
73
|
-
paragraphSpacingAfter: paragraphSpacingValue
|
|
74
|
-
? paragraphSpacingValue
|
|
75
|
-
: null,
|
|
76
|
-
};
|
|
77
|
-
} else {
|
|
78
|
-
attrs = {
|
|
79
|
-
...attrs,
|
|
80
|
-
paragraphSpacingBefore: paragraphSpacingValue
|
|
81
|
-
? paragraphSpacingValue
|
|
82
|
-
: null,
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
tr = tr.setNodeMarkup(pos, nodeType, attrs, node.marks);
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
return tr;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
class ParagraphSpacingCommand extends UICommand {
|
|
92
|
-
_paragraphSpacing: ?string;
|
|
93
|
-
_isAfter: ?boolean;
|
|
94
|
-
|
|
95
|
-
constructor(paragraphSpacing: ?string, isAfter: ?boolean) {
|
|
96
|
-
super();
|
|
97
|
-
this._paragraphSpacing = paragraphSpacing;
|
|
98
|
-
this._isAfter = isAfter;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
execute = (
|
|
102
|
-
state: EditorState,
|
|
103
|
-
dispatch: ?(tr: Transform) => void,
|
|
104
|
-
view: ?EditorView
|
|
105
|
-
): boolean => {
|
|
106
|
-
const { schema, selection } = state;
|
|
107
|
-
const tr = setParagraphSpacing(
|
|
108
|
-
state.tr.setSelection(selection),
|
|
109
|
-
schema,
|
|
110
|
-
this._paragraphSpacing,
|
|
111
|
-
this._isAfter
|
|
112
|
-
);
|
|
113
|
-
if (tr.docChanged) {
|
|
114
|
-
dispatch && dispatch(tr);
|
|
115
|
-
return true;
|
|
116
|
-
} else {
|
|
117
|
-
return false;
|
|
118
|
-
}
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
waitForUserInput = (
|
|
122
|
-
_state: EditorState,
|
|
123
|
-
_dispatch: ?(tr: Transform) => void,
|
|
124
|
-
_view: ?EditorView,
|
|
125
|
-
_event: ?React.SyntheticEvent
|
|
126
|
-
): Promise<undefined> => {
|
|
127
|
-
return Promise.resolve(undefined);
|
|
128
|
-
};
|
|
129
|
-
|
|
130
|
-
executeWithUserInput = (
|
|
131
|
-
_state: EditorState,
|
|
132
|
-
_dispatch: ?(tr: Transform) => void,
|
|
133
|
-
_view: ?EditorView,
|
|
134
|
-
_inputs: ?string
|
|
135
|
-
): boolean => {
|
|
136
|
-
return false;
|
|
137
|
-
};
|
|
138
|
-
|
|
139
|
-
cancel(): void {
|
|
140
|
-
return null;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
export default ParagraphSpacingCommand;
|
|
1
|
+
// @flow
|
|
2
|
+
|
|
3
|
+
import { UICommand } from '@modusoperandi/licit-doc-attrs-step';
|
|
4
|
+
import { AllSelection, TextSelection } from 'prosemirror-state';
|
|
5
|
+
import { BLOCKQUOTE, HEADING, LIST_ITEM, PARAGRAPH } from './NodeNames';
|
|
6
|
+
import { EditorState } from 'prosemirror-state';
|
|
7
|
+
import { EditorView } from 'prosemirror-view';
|
|
8
|
+
import { Schema } from 'prosemirror-model';
|
|
9
|
+
import { Transform } from 'prosemirror-transform';
|
|
10
|
+
import * as React from 'react';
|
|
11
|
+
|
|
12
|
+
export function setParagraphSpacing(
|
|
13
|
+
tr: Transform,
|
|
14
|
+
schema: Schema,
|
|
15
|
+
paragraphSpacing: ?string,
|
|
16
|
+
isAfter: ?boolean
|
|
17
|
+
): Transform {
|
|
18
|
+
const { selection, doc } = tr;
|
|
19
|
+
if (!selection || !doc) {
|
|
20
|
+
return tr;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (
|
|
24
|
+
!(selection instanceof TextSelection) &&
|
|
25
|
+
!(selection instanceof AllSelection)
|
|
26
|
+
) {
|
|
27
|
+
return tr;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const { from, to } = selection;
|
|
31
|
+
const paragraph = schema.nodes[PARAGRAPH];
|
|
32
|
+
const heading = schema.nodes[HEADING];
|
|
33
|
+
const listItem = schema.nodes[LIST_ITEM];
|
|
34
|
+
const blockquote = schema.nodes[BLOCKQUOTE];
|
|
35
|
+
if (!paragraph && !heading && !listItem && !blockquote) {
|
|
36
|
+
return tr;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const tasks = [];
|
|
40
|
+
const paragraphSpacingValue = paragraphSpacing || null;
|
|
41
|
+
|
|
42
|
+
doc.nodesBetween(from, to, (node, pos, parentNode) => {
|
|
43
|
+
const nodeType = node.type;
|
|
44
|
+
if (
|
|
45
|
+
nodeType === paragraph ||
|
|
46
|
+
nodeType === heading ||
|
|
47
|
+
nodeType === listItem ||
|
|
48
|
+
nodeType === blockquote
|
|
49
|
+
) {
|
|
50
|
+
const paragraphSpacing = node.attrs.paragraphSpacing || null;
|
|
51
|
+
if (paragraphSpacing !== paragraphSpacingValue) {
|
|
52
|
+
tasks.push({
|
|
53
|
+
node,
|
|
54
|
+
pos,
|
|
55
|
+
nodeType,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return nodeType === listItem ? true : false;
|
|
59
|
+
}
|
|
60
|
+
return true;
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
if (!tasks.length) {
|
|
64
|
+
return tr;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
tasks.forEach((job) => {
|
|
68
|
+
const { node, pos, nodeType } = job;
|
|
69
|
+
let { attrs } = node;
|
|
70
|
+
if (isAfter) {
|
|
71
|
+
attrs = {
|
|
72
|
+
...attrs,
|
|
73
|
+
paragraphSpacingAfter: paragraphSpacingValue
|
|
74
|
+
? paragraphSpacingValue
|
|
75
|
+
: null,
|
|
76
|
+
};
|
|
77
|
+
} else {
|
|
78
|
+
attrs = {
|
|
79
|
+
...attrs,
|
|
80
|
+
paragraphSpacingBefore: paragraphSpacingValue
|
|
81
|
+
? paragraphSpacingValue
|
|
82
|
+
: null,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
tr = tr.setNodeMarkup(pos, nodeType, attrs, node.marks);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
return tr;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
class ParagraphSpacingCommand extends UICommand {
|
|
92
|
+
_paragraphSpacing: ?string;
|
|
93
|
+
_isAfter: ?boolean;
|
|
94
|
+
|
|
95
|
+
constructor(paragraphSpacing: ?string, isAfter: ?boolean) {
|
|
96
|
+
super();
|
|
97
|
+
this._paragraphSpacing = paragraphSpacing;
|
|
98
|
+
this._isAfter = isAfter;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
execute = (
|
|
102
|
+
state: EditorState,
|
|
103
|
+
dispatch: ?(tr: Transform) => void,
|
|
104
|
+
view: ?EditorView
|
|
105
|
+
): boolean => {
|
|
106
|
+
const { schema, selection } = state;
|
|
107
|
+
const tr = setParagraphSpacing(
|
|
108
|
+
state.tr.setSelection(selection),
|
|
109
|
+
schema,
|
|
110
|
+
this._paragraphSpacing,
|
|
111
|
+
this._isAfter
|
|
112
|
+
);
|
|
113
|
+
if (tr.docChanged) {
|
|
114
|
+
dispatch && dispatch(tr);
|
|
115
|
+
return true;
|
|
116
|
+
} else {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
waitForUserInput = (
|
|
122
|
+
_state: EditorState,
|
|
123
|
+
_dispatch: ?(tr: Transform) => void,
|
|
124
|
+
_view: ?EditorView,
|
|
125
|
+
_event: ?React.SyntheticEvent
|
|
126
|
+
): Promise<undefined> => {
|
|
127
|
+
return Promise.resolve(undefined);
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
executeWithUserInput = (
|
|
131
|
+
_state: EditorState,
|
|
132
|
+
_dispatch: ?(tr: Transform) => void,
|
|
133
|
+
_view: ?EditorView,
|
|
134
|
+
_inputs: ?string
|
|
135
|
+
): boolean => {
|
|
136
|
+
return false;
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
cancel(): void {
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export default ParagraphSpacingCommand;
|