@portabletext/editor 1.15.0 → 1.15.2
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/lib/_chunks-cjs/behavior.core.cjs +494 -0
- package/lib/_chunks-cjs/behavior.core.cjs.map +1 -0
- package/lib/_chunks-cjs/selector.get-text-before.cjs +12 -232
- package/lib/_chunks-cjs/selector.get-text-before.cjs.map +1 -1
- package/lib/_chunks-cjs/selectors.cjs +234 -0
- package/lib/_chunks-cjs/selectors.cjs.map +1 -0
- package/lib/_chunks-es/behavior.core.js +496 -0
- package/lib/_chunks-es/behavior.core.js.map +1 -0
- package/lib/_chunks-es/selector.get-text-before.js +14 -234
- package/lib/_chunks-es/selector.get-text-before.js.map +1 -1
- package/lib/_chunks-es/selectors.js +235 -0
- package/lib/_chunks-es/selectors.js.map +1 -0
- package/lib/behaviors/index.cjs +460 -0
- package/lib/behaviors/index.cjs.map +1 -0
- package/lib/behaviors/index.d.cts +875 -0
- package/lib/behaviors/index.d.ts +875 -0
- package/lib/behaviors/index.js +464 -0
- package/lib/behaviors/index.js.map +1 -0
- package/lib/index.cjs +843 -1489
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +17 -536
- package/lib/index.d.ts +17 -536
- package/lib/index.js +837 -1482
- package/lib/index.js.map +1 -1
- package/lib/selectors/index.cjs +16 -16
- package/lib/selectors/index.cjs.map +1 -1
- package/lib/selectors/index.js +3 -2
- package/lib/selectors/index.js.map +1 -1
- package/package.json +13 -7
- package/src/{editor/behavior → behavior-actions}/behavior.action-utils.insert-block.ts +2 -2
- package/src/{editor/behavior → behavior-actions}/behavior.action.insert-block-object.ts +1 -1
- package/src/{editor/behavior → behavior-actions}/behavior.action.insert-break.ts +1 -1
- package/src/{editor/behavior → behavior-actions}/behavior.action.insert-inline-object.ts +1 -1
- package/src/{editor/behavior → behavior-actions}/behavior.action.list-item.ts +2 -2
- package/src/{editor/behavior → behavior-actions}/behavior.action.text-block.set.ts +1 -1
- package/src/{editor/behavior → behavior-actions}/behavior.action.text-block.unset.ts +1 -1
- package/src/{editor/behavior → behavior-actions}/behavior.actions.ts +14 -14
- package/src/{editor/behavior → behavior-actions}/behavior.guards.ts +1 -1
- package/src/{editor/behavior → behaviors}/behavior.code-editor.ts +4 -4
- package/src/{editor/behavior → behaviors}/behavior.core.block-objects.ts +5 -5
- package/src/{editor/behavior → behaviors}/behavior.core.decorators.ts +6 -16
- package/src/{editor/behavior → behaviors}/behavior.core.lists.ts +15 -15
- package/src/{editor/behavior → behaviors}/behavior.links.ts +4 -4
- package/src/{editor/behavior → behaviors}/behavior.markdown.ts +15 -25
- package/src/{editor/behavior → behaviors}/behavior.types.ts +32 -39
- package/src/behaviors/index.ts +28 -0
- package/src/editor/create-editor.ts +26 -46
- package/src/editor/editor-machine.ts +14 -12
- package/src/editor/plugins/createWithEditableAPI.ts +3 -3
- package/src/editor/plugins/createWithPortableTextMarkModel.ts +1 -1
- package/src/editor/utils/utils.block-offset.ts +1 -1
- package/src/index.ts +11 -26
- package/src/selectors/selector.get-active-list-item.ts +1 -1
- package/src/selectors/selectors.ts +1 -1
- package/src/type-utils.ts +17 -0
- package/src/utils/__tests__/operationToPatches.test.ts +1 -1
- package/src/utils/__tests__/patchToOperations.test.ts +1 -1
- /package/src/{editor/behavior → behavior-actions}/behavior.action.insert-span.ts +0 -0
- /package/src/{editor/behavior → behavior-actions}/behavior.action.style.ts +0 -0
- /package/src/{editor/behavior → behaviors}/behavior.core.ts +0 -0
|
@@ -0,0 +1,460 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: !0 });
|
|
3
|
+
var selectors = require("../_chunks-cjs/selectors.cjs"), behavior_core = require("../_chunks-cjs/behavior.core.cjs"), types = require("@sanity/types"), selector_getTextBefore = require("../_chunks-cjs/selector.get-text-before.cjs");
|
|
4
|
+
function createCodeEditorBehaviors(config) {
|
|
5
|
+
return [behavior_core.defineBehavior({
|
|
6
|
+
on: "key.down",
|
|
7
|
+
guard: ({
|
|
8
|
+
context,
|
|
9
|
+
event
|
|
10
|
+
}) => {
|
|
11
|
+
var _a;
|
|
12
|
+
const isMoveUpShortcut = behavior_core.isHotkey(config.moveBlockUpShortcut, event.keyboardEvent), firstBlock = selectors.getFirstBlock({
|
|
13
|
+
context
|
|
14
|
+
}), selectedBlocks = selectors.getSelectedBlocks({
|
|
15
|
+
context
|
|
16
|
+
}), blocksAbove = (firstBlock == null ? void 0 : firstBlock.node._key) !== ((_a = selectedBlocks[0]) == null ? void 0 : _a.node._key);
|
|
17
|
+
return !isMoveUpShortcut || !blocksAbove ? !1 : {
|
|
18
|
+
paths: selectedBlocks.map((block) => block.path)
|
|
19
|
+
};
|
|
20
|
+
},
|
|
21
|
+
actions: [(_, {
|
|
22
|
+
paths
|
|
23
|
+
}) => paths.map((at) => ({
|
|
24
|
+
type: "move.block up",
|
|
25
|
+
at
|
|
26
|
+
}))]
|
|
27
|
+
}), behavior_core.defineBehavior({
|
|
28
|
+
on: "key.down",
|
|
29
|
+
guard: ({
|
|
30
|
+
context,
|
|
31
|
+
event
|
|
32
|
+
}) => {
|
|
33
|
+
var _a;
|
|
34
|
+
const isMoveDownShortcut = behavior_core.isHotkey(config.moveBlockDownShortcut, event.keyboardEvent), lastBlock = selectors.getLastBlock({
|
|
35
|
+
context
|
|
36
|
+
}), selectedBlocks = selectors.getSelectedBlocks({
|
|
37
|
+
context
|
|
38
|
+
}), blocksBelow = (lastBlock == null ? void 0 : lastBlock.node._key) !== ((_a = selectedBlocks[selectedBlocks.length - 1]) == null ? void 0 : _a.node._key);
|
|
39
|
+
return !isMoveDownShortcut || !blocksBelow ? !1 : {
|
|
40
|
+
paths: selectedBlocks.map((block) => block.path).reverse()
|
|
41
|
+
};
|
|
42
|
+
},
|
|
43
|
+
actions: [(_, {
|
|
44
|
+
paths
|
|
45
|
+
}) => paths.map((at) => ({
|
|
46
|
+
type: "move.block down",
|
|
47
|
+
at
|
|
48
|
+
}))]
|
|
49
|
+
})];
|
|
50
|
+
}
|
|
51
|
+
function createLinkBehaviors(config) {
|
|
52
|
+
const pasteLinkOnSelection = behavior_core.defineBehavior({
|
|
53
|
+
on: "paste",
|
|
54
|
+
guard: ({
|
|
55
|
+
context,
|
|
56
|
+
event
|
|
57
|
+
}) => {
|
|
58
|
+
var _a;
|
|
59
|
+
const selectionCollapsed = selectors.selectionIsCollapsed({
|
|
60
|
+
context
|
|
61
|
+
}), text = event.data.getData("text/plain"), url = looksLikeUrl(text) ? text : void 0, annotation = url !== void 0 ? (_a = config.linkAnnotation) == null ? void 0 : _a.call(config, {
|
|
62
|
+
url,
|
|
63
|
+
schema: context.schema
|
|
64
|
+
}) : void 0;
|
|
65
|
+
return annotation && !selectionCollapsed ? {
|
|
66
|
+
annotation
|
|
67
|
+
} : !1;
|
|
68
|
+
},
|
|
69
|
+
actions: [(_, {
|
|
70
|
+
annotation
|
|
71
|
+
}) => [{
|
|
72
|
+
type: "annotation.add",
|
|
73
|
+
annotation
|
|
74
|
+
}]]
|
|
75
|
+
}), pasteLinkAtCaret = behavior_core.defineBehavior({
|
|
76
|
+
on: "paste",
|
|
77
|
+
guard: ({
|
|
78
|
+
context,
|
|
79
|
+
event
|
|
80
|
+
}) => {
|
|
81
|
+
var _a;
|
|
82
|
+
const focusSpan = selectors.getFocusSpan({
|
|
83
|
+
context
|
|
84
|
+
}), selectionCollapsed = selectors.selectionIsCollapsed({
|
|
85
|
+
context
|
|
86
|
+
});
|
|
87
|
+
if (!focusSpan || !selectionCollapsed)
|
|
88
|
+
return !1;
|
|
89
|
+
const text = event.data.getData("text/plain"), url = looksLikeUrl(text) ? text : void 0, annotation = url !== void 0 ? (_a = config.linkAnnotation) == null ? void 0 : _a.call(config, {
|
|
90
|
+
url,
|
|
91
|
+
schema: context.schema
|
|
92
|
+
}) : void 0;
|
|
93
|
+
return url && annotation && selectionCollapsed ? {
|
|
94
|
+
focusSpan,
|
|
95
|
+
annotation,
|
|
96
|
+
url
|
|
97
|
+
} : !1;
|
|
98
|
+
},
|
|
99
|
+
actions: [(_, {
|
|
100
|
+
annotation,
|
|
101
|
+
url
|
|
102
|
+
}) => [{
|
|
103
|
+
type: "insert.span",
|
|
104
|
+
text: url,
|
|
105
|
+
annotations: [annotation]
|
|
106
|
+
}]]
|
|
107
|
+
});
|
|
108
|
+
return [pasteLinkOnSelection, pasteLinkAtCaret];
|
|
109
|
+
}
|
|
110
|
+
function looksLikeUrl(text) {
|
|
111
|
+
let looksLikeUrl2 = !1;
|
|
112
|
+
try {
|
|
113
|
+
new URL(text), looksLikeUrl2 = !0;
|
|
114
|
+
} catch (e) {
|
|
115
|
+
}
|
|
116
|
+
return looksLikeUrl2;
|
|
117
|
+
}
|
|
118
|
+
var __defProp = Object.defineProperty, __getOwnPropSymbols = Object.getOwnPropertySymbols, __hasOwnProp = Object.prototype.hasOwnProperty, __propIsEnum = Object.prototype.propertyIsEnumerable, __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: !0, configurable: !0, writable: !0, value }) : obj[key] = value, __spreadValues = (a, b) => {
|
|
119
|
+
for (var prop in b || (b = {}))
|
|
120
|
+
__hasOwnProp.call(b, prop) && __defNormalProp(a, prop, b[prop]);
|
|
121
|
+
if (__getOwnPropSymbols)
|
|
122
|
+
for (var prop of __getOwnPropSymbols(b))
|
|
123
|
+
__propIsEnum.call(b, prop) && __defNormalProp(a, prop, b[prop]);
|
|
124
|
+
return a;
|
|
125
|
+
};
|
|
126
|
+
function createMarkdownBehaviors(config) {
|
|
127
|
+
const automaticBlockquoteOnSpace = behavior_core.defineBehavior({
|
|
128
|
+
on: "insert.text",
|
|
129
|
+
guard: ({
|
|
130
|
+
context,
|
|
131
|
+
event
|
|
132
|
+
}) => {
|
|
133
|
+
var _a;
|
|
134
|
+
if (event.text !== " ")
|
|
135
|
+
return !1;
|
|
136
|
+
const selectionCollapsed = selectors.selectionIsCollapsed({
|
|
137
|
+
context
|
|
138
|
+
}), focusTextBlock = selectors.getFocusTextBlock({
|
|
139
|
+
context
|
|
140
|
+
}), focusSpan = selectors.getFocusSpan({
|
|
141
|
+
context
|
|
142
|
+
});
|
|
143
|
+
if (!selectionCollapsed || !focusTextBlock || !focusSpan)
|
|
144
|
+
return !1;
|
|
145
|
+
const blockOffset = behavior_core.spanSelectionPointToBlockOffset({
|
|
146
|
+
value: context.value,
|
|
147
|
+
selectionPoint: {
|
|
148
|
+
path: [{
|
|
149
|
+
_key: focusTextBlock.node._key
|
|
150
|
+
}, "children", {
|
|
151
|
+
_key: focusSpan.node._key
|
|
152
|
+
}],
|
|
153
|
+
offset: context.selection.focus.offset
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
if (!blockOffset)
|
|
157
|
+
return !1;
|
|
158
|
+
const blockText = behavior_core.getTextBlockText(focusTextBlock.node), caretAtTheEndOfQuote = blockOffset.offset === 1, looksLikeMarkdownQuote = /^>/.test(blockText), blockquoteStyle = (_a = config.blockquoteStyle) == null ? void 0 : _a.call(config, context);
|
|
159
|
+
return caretAtTheEndOfQuote && looksLikeMarkdownQuote && blockquoteStyle !== void 0 ? {
|
|
160
|
+
focusTextBlock,
|
|
161
|
+
style: blockquoteStyle
|
|
162
|
+
} : !1;
|
|
163
|
+
},
|
|
164
|
+
actions: [() => [{
|
|
165
|
+
type: "insert.text",
|
|
166
|
+
text: " "
|
|
167
|
+
}], (_, {
|
|
168
|
+
focusTextBlock,
|
|
169
|
+
style
|
|
170
|
+
}) => [{
|
|
171
|
+
type: "text block.unset",
|
|
172
|
+
props: ["listItem", "level"],
|
|
173
|
+
at: focusTextBlock.path
|
|
174
|
+
}, {
|
|
175
|
+
type: "text block.set",
|
|
176
|
+
style,
|
|
177
|
+
at: focusTextBlock.path
|
|
178
|
+
}, {
|
|
179
|
+
type: "delete.text",
|
|
180
|
+
anchor: {
|
|
181
|
+
path: focusTextBlock.path,
|
|
182
|
+
offset: 0
|
|
183
|
+
},
|
|
184
|
+
focus: {
|
|
185
|
+
path: focusTextBlock.path,
|
|
186
|
+
offset: 2
|
|
187
|
+
}
|
|
188
|
+
}]]
|
|
189
|
+
}), automaticHr = behavior_core.defineBehavior({
|
|
190
|
+
on: "insert.text",
|
|
191
|
+
guard: ({
|
|
192
|
+
context,
|
|
193
|
+
event
|
|
194
|
+
}) => {
|
|
195
|
+
var _a;
|
|
196
|
+
const hrCharacter = event.text === "-" ? "-" : event.text === "*" ? "*" : event.text === "_" ? "_" : void 0;
|
|
197
|
+
if (hrCharacter === void 0)
|
|
198
|
+
return !1;
|
|
199
|
+
const hrObject = (_a = config.horizontalRuleObject) == null ? void 0 : _a.call(config, context), focusBlock = selectors.getFocusTextBlock({
|
|
200
|
+
context
|
|
201
|
+
}), selectionCollapsed = selectors.selectionIsCollapsed({
|
|
202
|
+
context
|
|
203
|
+
});
|
|
204
|
+
if (!hrObject || !focusBlock || !selectionCollapsed)
|
|
205
|
+
return !1;
|
|
206
|
+
const textBefore = selector_getTextBefore.getBlockTextBefore({
|
|
207
|
+
context
|
|
208
|
+
}), hrBlockOffsets = {
|
|
209
|
+
anchor: {
|
|
210
|
+
path: focusBlock.path,
|
|
211
|
+
offset: 0
|
|
212
|
+
},
|
|
213
|
+
focus: {
|
|
214
|
+
path: focusBlock.path,
|
|
215
|
+
offset: 3
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
return textBefore === `${hrCharacter}${hrCharacter}` ? {
|
|
219
|
+
hrObject,
|
|
220
|
+
focusBlock,
|
|
221
|
+
hrCharacter,
|
|
222
|
+
hrBlockOffsets
|
|
223
|
+
} : !1;
|
|
224
|
+
},
|
|
225
|
+
actions: [(_, {
|
|
226
|
+
hrCharacter
|
|
227
|
+
}) => [{
|
|
228
|
+
type: "insert.text",
|
|
229
|
+
text: hrCharacter
|
|
230
|
+
}], (_, {
|
|
231
|
+
hrObject,
|
|
232
|
+
hrBlockOffsets
|
|
233
|
+
}) => [{
|
|
234
|
+
type: "insert.block object",
|
|
235
|
+
placement: "before",
|
|
236
|
+
blockObject: hrObject
|
|
237
|
+
}, __spreadValues({
|
|
238
|
+
type: "delete.text"
|
|
239
|
+
}, hrBlockOffsets)]]
|
|
240
|
+
}), automaticHrOnPaste = behavior_core.defineBehavior({
|
|
241
|
+
on: "paste",
|
|
242
|
+
guard: ({
|
|
243
|
+
context,
|
|
244
|
+
event
|
|
245
|
+
}) => {
|
|
246
|
+
var _a, _b;
|
|
247
|
+
const text = event.data.getData("text/plain"), hrRegExp = /^(---)$|(___)$|(\*\*\*)$/gm, hrCharacters = (_a = text.match(hrRegExp)) == null ? void 0 : _a[0], hrObject = (_b = config.horizontalRuleObject) == null ? void 0 : _b.call(config, context), focusBlock = selectors.getFocusBlock({
|
|
248
|
+
context
|
|
249
|
+
});
|
|
250
|
+
return !hrCharacters || !hrObject || !focusBlock ? !1 : {
|
|
251
|
+
hrCharacters,
|
|
252
|
+
hrObject,
|
|
253
|
+
focusBlock
|
|
254
|
+
};
|
|
255
|
+
},
|
|
256
|
+
actions: [(_, {
|
|
257
|
+
hrCharacters
|
|
258
|
+
}) => [{
|
|
259
|
+
type: "insert.text",
|
|
260
|
+
text: hrCharacters
|
|
261
|
+
}], (_, {
|
|
262
|
+
hrObject,
|
|
263
|
+
focusBlock
|
|
264
|
+
}) => types.isPortableTextTextBlock(focusBlock.node) ? [{
|
|
265
|
+
type: "insert.text block",
|
|
266
|
+
textBlock: {
|
|
267
|
+
children: focusBlock.node.children
|
|
268
|
+
},
|
|
269
|
+
placement: "after"
|
|
270
|
+
}, {
|
|
271
|
+
type: "insert.block object",
|
|
272
|
+
blockObject: hrObject,
|
|
273
|
+
placement: "after"
|
|
274
|
+
}, {
|
|
275
|
+
type: "delete.block",
|
|
276
|
+
blockPath: focusBlock.path
|
|
277
|
+
}] : [{
|
|
278
|
+
type: "insert.block object",
|
|
279
|
+
blockObject: hrObject,
|
|
280
|
+
placement: "after"
|
|
281
|
+
}]]
|
|
282
|
+
}), automaticHeadingOnSpace = behavior_core.defineBehavior({
|
|
283
|
+
on: "insert.text",
|
|
284
|
+
guard: ({
|
|
285
|
+
context,
|
|
286
|
+
event
|
|
287
|
+
}) => {
|
|
288
|
+
var _a;
|
|
289
|
+
if (event.text !== " ")
|
|
290
|
+
return !1;
|
|
291
|
+
const selectionCollapsed = selectors.selectionIsCollapsed({
|
|
292
|
+
context
|
|
293
|
+
}), focusTextBlock = selectors.getFocusTextBlock({
|
|
294
|
+
context
|
|
295
|
+
}), focusSpan = selectors.getFocusSpan({
|
|
296
|
+
context
|
|
297
|
+
});
|
|
298
|
+
if (!selectionCollapsed || !focusTextBlock || !focusSpan)
|
|
299
|
+
return !1;
|
|
300
|
+
const blockOffset = behavior_core.spanSelectionPointToBlockOffset({
|
|
301
|
+
value: context.value,
|
|
302
|
+
selectionPoint: {
|
|
303
|
+
path: [{
|
|
304
|
+
_key: focusTextBlock.node._key
|
|
305
|
+
}, "children", {
|
|
306
|
+
_key: focusSpan.node._key
|
|
307
|
+
}],
|
|
308
|
+
offset: context.selection.focus.offset
|
|
309
|
+
}
|
|
310
|
+
});
|
|
311
|
+
if (!blockOffset)
|
|
312
|
+
return !1;
|
|
313
|
+
const blockText = behavior_core.getTextBlockText(focusTextBlock.node), markdownHeadingSearch = /^#+/.exec(blockText), level = markdownHeadingSearch ? markdownHeadingSearch[0].length : void 0;
|
|
314
|
+
if (blockOffset.offset !== level)
|
|
315
|
+
return !1;
|
|
316
|
+
const style = level !== void 0 ? (_a = config.headingStyle) == null ? void 0 : _a.call(config, {
|
|
317
|
+
schema: context.schema,
|
|
318
|
+
level
|
|
319
|
+
}) : void 0;
|
|
320
|
+
return level !== void 0 && style !== void 0 ? {
|
|
321
|
+
focusTextBlock,
|
|
322
|
+
style,
|
|
323
|
+
level
|
|
324
|
+
} : !1;
|
|
325
|
+
},
|
|
326
|
+
actions: [({
|
|
327
|
+
event
|
|
328
|
+
}) => [event], (_, {
|
|
329
|
+
focusTextBlock,
|
|
330
|
+
style,
|
|
331
|
+
level
|
|
332
|
+
}) => [{
|
|
333
|
+
type: "text block.unset",
|
|
334
|
+
props: ["listItem", "level"],
|
|
335
|
+
at: focusTextBlock.path
|
|
336
|
+
}, {
|
|
337
|
+
type: "text block.set",
|
|
338
|
+
style,
|
|
339
|
+
at: focusTextBlock.path
|
|
340
|
+
}, {
|
|
341
|
+
type: "delete.text",
|
|
342
|
+
anchor: {
|
|
343
|
+
path: focusTextBlock.path,
|
|
344
|
+
offset: 0
|
|
345
|
+
},
|
|
346
|
+
focus: {
|
|
347
|
+
path: focusTextBlock.path,
|
|
348
|
+
offset: level + 1
|
|
349
|
+
}
|
|
350
|
+
}]]
|
|
351
|
+
}), clearStyleOnBackspace = behavior_core.defineBehavior({
|
|
352
|
+
on: "delete.backward",
|
|
353
|
+
guard: ({
|
|
354
|
+
context
|
|
355
|
+
}) => {
|
|
356
|
+
var _a;
|
|
357
|
+
const selectionCollapsed = selectors.selectionIsCollapsed({
|
|
358
|
+
context
|
|
359
|
+
}), focusTextBlock = selectors.getFocusTextBlock({
|
|
360
|
+
context
|
|
361
|
+
}), focusSpan = selectors.getFocusSpan({
|
|
362
|
+
context
|
|
363
|
+
});
|
|
364
|
+
if (!selectionCollapsed || !focusTextBlock || !focusSpan)
|
|
365
|
+
return !1;
|
|
366
|
+
const atTheBeginningOfBLock = focusTextBlock.node.children[0]._key === focusSpan.node._key && context.selection.focus.offset === 0, defaultStyle = (_a = config.defaultStyle) == null ? void 0 : _a.call(config, context);
|
|
367
|
+
return atTheBeginningOfBLock && defaultStyle && focusTextBlock.node.style !== defaultStyle ? {
|
|
368
|
+
defaultStyle,
|
|
369
|
+
focusTextBlock
|
|
370
|
+
} : !1;
|
|
371
|
+
},
|
|
372
|
+
actions: [(_, {
|
|
373
|
+
defaultStyle,
|
|
374
|
+
focusTextBlock
|
|
375
|
+
}) => [{
|
|
376
|
+
type: "text block.set",
|
|
377
|
+
style: defaultStyle,
|
|
378
|
+
at: focusTextBlock.path
|
|
379
|
+
}]]
|
|
380
|
+
}), automaticListOnSpace = behavior_core.defineBehavior({
|
|
381
|
+
on: "insert.text",
|
|
382
|
+
guard: ({
|
|
383
|
+
context,
|
|
384
|
+
event
|
|
385
|
+
}) => {
|
|
386
|
+
var _a, _b, _c;
|
|
387
|
+
if (event.text !== " ")
|
|
388
|
+
return !1;
|
|
389
|
+
const selectionCollapsed = selectors.selectionIsCollapsed({
|
|
390
|
+
context
|
|
391
|
+
}), focusTextBlock = selectors.getFocusTextBlock({
|
|
392
|
+
context
|
|
393
|
+
}), focusSpan = selectors.getFocusSpan({
|
|
394
|
+
context
|
|
395
|
+
});
|
|
396
|
+
if (!selectionCollapsed || !focusTextBlock || !focusSpan)
|
|
397
|
+
return !1;
|
|
398
|
+
const blockOffset = behavior_core.spanSelectionPointToBlockOffset({
|
|
399
|
+
value: context.value,
|
|
400
|
+
selectionPoint: {
|
|
401
|
+
path: [{
|
|
402
|
+
_key: focusTextBlock.node._key
|
|
403
|
+
}, "children", {
|
|
404
|
+
_key: focusSpan.node._key
|
|
405
|
+
}],
|
|
406
|
+
offset: context.selection.focus.offset
|
|
407
|
+
}
|
|
408
|
+
});
|
|
409
|
+
if (!blockOffset)
|
|
410
|
+
return !1;
|
|
411
|
+
const blockText = behavior_core.getTextBlockText(focusTextBlock.node), defaultStyle = (_a = config.defaultStyle) == null ? void 0 : _a.call(config, context), looksLikeUnorderedList = /^(-|\*)/.test(blockText), unorderedListStyle = (_b = config.unorderedListStyle) == null ? void 0 : _b.call(config, context), caretAtTheEndOfUnorderedList = blockOffset.offset === 1;
|
|
412
|
+
if (defaultStyle && caretAtTheEndOfUnorderedList && looksLikeUnorderedList && unorderedListStyle !== void 0)
|
|
413
|
+
return {
|
|
414
|
+
focusTextBlock,
|
|
415
|
+
listItem: unorderedListStyle,
|
|
416
|
+
listItemLength: 1,
|
|
417
|
+
style: defaultStyle
|
|
418
|
+
};
|
|
419
|
+
const looksLikeOrderedList = /^1\./.test(blockText), orderedListStyle = (_c = config.orderedListStyle) == null ? void 0 : _c.call(config, context), caretAtTheEndOfOrderedList = blockOffset.offset === 2;
|
|
420
|
+
return defaultStyle && caretAtTheEndOfOrderedList && looksLikeOrderedList && orderedListStyle !== void 0 ? {
|
|
421
|
+
focusTextBlock,
|
|
422
|
+
listItem: orderedListStyle,
|
|
423
|
+
listItemLength: 2,
|
|
424
|
+
style: defaultStyle
|
|
425
|
+
} : !1;
|
|
426
|
+
},
|
|
427
|
+
actions: [({
|
|
428
|
+
event
|
|
429
|
+
}) => [event], (_, {
|
|
430
|
+
focusTextBlock,
|
|
431
|
+
style,
|
|
432
|
+
listItem,
|
|
433
|
+
listItemLength
|
|
434
|
+
}) => [{
|
|
435
|
+
type: "text block.set",
|
|
436
|
+
listItem,
|
|
437
|
+
level: 1,
|
|
438
|
+
style,
|
|
439
|
+
at: focusTextBlock.path
|
|
440
|
+
}, {
|
|
441
|
+
type: "delete.text",
|
|
442
|
+
anchor: {
|
|
443
|
+
path: focusTextBlock.path,
|
|
444
|
+
offset: 0
|
|
445
|
+
},
|
|
446
|
+
focus: {
|
|
447
|
+
path: focusTextBlock.path,
|
|
448
|
+
offset: listItemLength + 1
|
|
449
|
+
}
|
|
450
|
+
}]]
|
|
451
|
+
});
|
|
452
|
+
return [automaticBlockquoteOnSpace, automaticHeadingOnSpace, automaticHr, automaticHrOnPaste, clearStyleOnBackspace, automaticListOnSpace];
|
|
453
|
+
}
|
|
454
|
+
exports.coreBehavior = behavior_core.coreBehavior;
|
|
455
|
+
exports.coreBehaviors = behavior_core.coreBehaviors;
|
|
456
|
+
exports.defineBehavior = behavior_core.defineBehavior;
|
|
457
|
+
exports.createCodeEditorBehaviors = createCodeEditorBehaviors;
|
|
458
|
+
exports.createLinkBehaviors = createLinkBehaviors;
|
|
459
|
+
exports.createMarkdownBehaviors = createMarkdownBehaviors;
|
|
460
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/behaviors/behavior.code-editor.ts","../../src/behaviors/behavior.links.ts","../../src/behaviors/behavior.markdown.ts"],"sourcesContent":["import {\n getFirstBlock,\n getLastBlock,\n getSelectedBlocks,\n} from '../selectors/selectors'\nimport {isHotkey} from '../utils/is-hotkey'\nimport {defineBehavior} from './behavior.types'\n\n/**\n * @alpha\n */\nexport type CodeEditorBehaviorsConfig = {\n moveBlockUpShortcut: string\n moveBlockDownShortcut: string\n}\n\n/**\n * @alpha\n */\nexport function createCodeEditorBehaviors(config: CodeEditorBehaviorsConfig) {\n return [\n defineBehavior({\n on: 'key.down',\n guard: ({context, event}) => {\n const isMoveUpShortcut = isHotkey(\n config.moveBlockUpShortcut,\n event.keyboardEvent,\n )\n const firstBlock = getFirstBlock({context})\n const selectedBlocks = getSelectedBlocks({context})\n const blocksAbove =\n firstBlock?.node._key !== selectedBlocks[0]?.node._key\n\n if (!isMoveUpShortcut || !blocksAbove) {\n return false\n }\n\n return {paths: selectedBlocks.map((block) => block.path)}\n },\n actions: [\n (_, {paths}) =>\n paths.map((at) => ({\n type: 'move.block up',\n at,\n })),\n ],\n }),\n defineBehavior({\n on: 'key.down',\n guard: ({context, event}) => {\n const isMoveDownShortcut = isHotkey(\n config.moveBlockDownShortcut,\n event.keyboardEvent,\n )\n const lastBlock = getLastBlock({context})\n const selectedBlocks = getSelectedBlocks({context})\n const blocksBelow =\n lastBlock?.node._key !==\n selectedBlocks[selectedBlocks.length - 1]?.node._key\n\n if (!isMoveDownShortcut || !blocksBelow) {\n return false\n }\n\n return {paths: selectedBlocks.map((block) => block.path).reverse()}\n },\n actions: [\n (_, {paths}) =>\n paths.map((at) => ({\n type: 'move.block down',\n at,\n })),\n ],\n }),\n ]\n}\n","import {getFocusSpan, selectionIsCollapsed} from '../selectors/selectors'\nimport type {PortableTextMemberSchemaTypes} from '../types/editor'\nimport {defineBehavior} from './behavior.types'\n\n/**\n * @alpha\n */\nexport type LinkBehaviorsConfig = {\n linkAnnotation?: (context: {\n schema: PortableTextMemberSchemaTypes\n url: string\n }) => {name: string; value: {[prop: string]: unknown}} | undefined\n}\n\n/**\n * @alpha\n */\nexport function createLinkBehaviors(config: LinkBehaviorsConfig) {\n const pasteLinkOnSelection = defineBehavior({\n on: 'paste',\n guard: ({context, event}) => {\n const selectionCollapsed = selectionIsCollapsed({context})\n const text = event.data.getData('text/plain')\n const url = looksLikeUrl(text) ? text : undefined\n const annotation =\n url !== undefined\n ? config.linkAnnotation?.({url, schema: context.schema})\n : undefined\n\n if (annotation && !selectionCollapsed) {\n return {annotation}\n }\n\n return false\n },\n actions: [\n (_, {annotation}) => [\n {\n type: 'annotation.add',\n annotation,\n },\n ],\n ],\n })\n const pasteLinkAtCaret = defineBehavior({\n on: 'paste',\n guard: ({context, event}) => {\n const focusSpan = getFocusSpan({context})\n const selectionCollapsed = selectionIsCollapsed({context})\n\n if (!focusSpan || !selectionCollapsed) {\n return false\n }\n\n const text = event.data.getData('text/plain')\n const url = looksLikeUrl(text) ? text : undefined\n const annotation =\n url !== undefined\n ? config.linkAnnotation?.({url, schema: context.schema})\n : undefined\n\n if (url && annotation && selectionCollapsed) {\n return {focusSpan, annotation, url}\n }\n\n return false\n },\n actions: [\n (_, {annotation, url}) => [\n {\n type: 'insert.span',\n text: url,\n annotations: [annotation],\n },\n ],\n ],\n })\n\n const linkBehaviors = [pasteLinkOnSelection, pasteLinkAtCaret]\n\n return linkBehaviors\n}\n\nfunction looksLikeUrl(text: string) {\n let looksLikeUrl = false\n try {\n new URL(text)\n looksLikeUrl = true\n } catch {}\n return looksLikeUrl\n}\n","import {isPortableTextTextBlock} from '@sanity/types'\nimport {getTextBlockText} from '../editor/utils/utils'\nimport {spanSelectionPointToBlockOffset} from '../editor/utils/utils.block-offset'\nimport {getBlockTextBefore} from '../selectors/selector.get-text-before'\nimport {\n getFocusBlock,\n getFocusSpan,\n getFocusTextBlock,\n selectionIsCollapsed,\n} from '../selectors/selectors'\nimport type {PortableTextMemberSchemaTypes} from '../types/editor'\nimport {defineBehavior} from './behavior.types'\n\n/**\n * @alpha\n */\nexport type MarkdownBehaviorsConfig = {\n horizontalRuleObject?: (context: {\n schema: PortableTextMemberSchemaTypes\n }) => {name: string; value?: {[prop: string]: unknown}} | undefined\n defaultStyle?: (context: {\n schema: PortableTextMemberSchemaTypes\n }) => string | undefined\n headingStyle?: (context: {\n schema: PortableTextMemberSchemaTypes\n level: number\n }) => string | undefined\n blockquoteStyle?: (context: {\n schema: PortableTextMemberSchemaTypes\n }) => string | undefined\n unorderedListStyle?: (context: {\n schema: PortableTextMemberSchemaTypes\n }) => string | undefined\n orderedListStyle?: (context: {\n schema: PortableTextMemberSchemaTypes\n }) => string | undefined\n}\n\n/**\n * @alpha\n */\nexport function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {\n const automaticBlockquoteOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectionIsCollapsed({context})\n const focusTextBlock = getFocusTextBlock({context})\n const focusSpan = getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: context.selection.focus.offset,\n },\n })\n\n if (!blockOffset) {\n return false\n }\n\n const blockText = getTextBlockText(focusTextBlock.node)\n const caretAtTheEndOfQuote = blockOffset.offset === 1\n const looksLikeMarkdownQuote = /^>/.test(blockText)\n const blockquoteStyle = config.blockquoteStyle?.(context)\n\n if (\n caretAtTheEndOfQuote &&\n looksLikeMarkdownQuote &&\n blockquoteStyle !== undefined\n ) {\n return {focusTextBlock, style: blockquoteStyle}\n }\n\n return false\n },\n actions: [\n () => [\n {\n type: 'insert.text',\n text: ' ',\n },\n ],\n (_, {focusTextBlock, style}) => [\n {\n type: 'text block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n },\n {\n type: 'text block.set',\n style,\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: 2,\n },\n },\n ],\n ],\n })\n const automaticHr = defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const hrCharacter =\n event.text === '-'\n ? '-'\n : event.text === '*'\n ? '*'\n : event.text === '_'\n ? '_'\n : undefined\n\n if (hrCharacter === undefined) {\n return false\n }\n\n const hrObject = config.horizontalRuleObject?.(context)\n const focusBlock = getFocusTextBlock({context})\n const selectionCollapsed = selectionIsCollapsed({context})\n\n if (!hrObject || !focusBlock || !selectionCollapsed) {\n return false\n }\n\n const textBefore = getBlockTextBefore({context})\n const hrBlockOffsets = {\n anchor: {\n path: focusBlock.path,\n offset: 0,\n },\n focus: {\n path: focusBlock.path,\n offset: 3,\n },\n }\n\n if (textBefore === `${hrCharacter}${hrCharacter}`) {\n return {hrObject, focusBlock, hrCharacter, hrBlockOffsets}\n }\n\n return false\n },\n actions: [\n (_, {hrCharacter}) => [\n {\n type: 'insert.text',\n text: hrCharacter,\n },\n ],\n (_, {hrObject, hrBlockOffsets}) => [\n {\n type: 'insert.block object',\n placement: 'before',\n blockObject: hrObject,\n },\n {\n type: 'delete.text',\n ...hrBlockOffsets,\n },\n ],\n ],\n })\n const automaticHrOnPaste = defineBehavior({\n on: 'paste',\n guard: ({context, event}) => {\n const text = event.data.getData('text/plain')\n const hrRegExp = /^(---)$|(___)$|(\\*\\*\\*)$/gm\n const hrCharacters = text.match(hrRegExp)?.[0]\n const hrObject = config.horizontalRuleObject?.(context)\n const focusBlock = getFocusBlock({context})\n\n if (!hrCharacters || !hrObject || !focusBlock) {\n return false\n }\n\n return {hrCharacters, hrObject, focusBlock}\n },\n actions: [\n (_, {hrCharacters}) => [\n {\n type: 'insert.text',\n text: hrCharacters,\n },\n ],\n (_, {hrObject, focusBlock}) =>\n isPortableTextTextBlock(focusBlock.node)\n ? [\n {\n type: 'insert.text block',\n textBlock: {children: focusBlock.node.children},\n placement: 'after',\n },\n {\n type: 'insert.block object',\n blockObject: hrObject,\n placement: 'after',\n },\n {type: 'delete.block', blockPath: focusBlock.path},\n ]\n : [\n {\n type: 'insert.block object',\n blockObject: hrObject,\n placement: 'after',\n },\n ],\n ],\n })\n const automaticHeadingOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectionIsCollapsed({context})\n const focusTextBlock = getFocusTextBlock({context})\n const focusSpan = getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: context.selection.focus.offset,\n },\n })\n\n if (!blockOffset) {\n return false\n }\n\n const blockText = getTextBlockText(focusTextBlock.node)\n const markdownHeadingSearch = /^#+/.exec(blockText)\n const level = markdownHeadingSearch\n ? markdownHeadingSearch[0].length\n : undefined\n const caretAtTheEndOfHeading = blockOffset.offset === level\n\n if (!caretAtTheEndOfHeading) {\n return false\n }\n\n const style =\n level !== undefined\n ? config.headingStyle?.({schema: context.schema, level})\n : undefined\n\n if (level !== undefined && style !== undefined) {\n return {\n focusTextBlock,\n style: style,\n level,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [event],\n (_, {focusTextBlock, style, level}) => [\n {\n type: 'text block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n },\n {\n type: 'text block.set',\n style,\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: level + 1,\n },\n },\n ],\n ],\n })\n const clearStyleOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({context}) => {\n const selectionCollapsed = selectionIsCollapsed({context})\n const focusTextBlock = getFocusTextBlock({context})\n const focusSpan = getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n context.selection.focus.offset === 0\n\n const defaultStyle = config.defaultStyle?.(context)\n\n if (\n atTheBeginningOfBLock &&\n defaultStyle &&\n focusTextBlock.node.style !== defaultStyle\n ) {\n return {defaultStyle, focusTextBlock}\n }\n\n return false\n },\n actions: [\n (_, {defaultStyle, focusTextBlock}) => [\n {\n type: 'text block.set',\n style: defaultStyle,\n at: focusTextBlock.path,\n },\n ],\n ],\n })\n const automaticListOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectionIsCollapsed({context})\n const focusTextBlock = getFocusTextBlock({context})\n const focusSpan = getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: context.selection.focus.offset,\n },\n })\n\n if (!blockOffset) {\n return false\n }\n\n const blockText = getTextBlockText(focusTextBlock.node)\n const defaultStyle = config.defaultStyle?.(context)\n const looksLikeUnorderedList = /^(-|\\*)/.test(blockText)\n const unorderedListStyle = config.unorderedListStyle?.(context)\n const caretAtTheEndOfUnorderedList = blockOffset.offset === 1\n\n if (\n defaultStyle &&\n caretAtTheEndOfUnorderedList &&\n looksLikeUnorderedList &&\n unorderedListStyle !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: unorderedListStyle,\n listItemLength: 1,\n style: defaultStyle,\n }\n }\n\n const looksLikeOrderedList = /^1\\./.test(blockText)\n const orderedListStyle = config.orderedListStyle?.(context)\n const caretAtTheEndOfOrderedList = blockOffset.offset === 2\n\n if (\n defaultStyle &&\n caretAtTheEndOfOrderedList &&\n looksLikeOrderedList &&\n orderedListStyle !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: orderedListStyle,\n listItemLength: 2,\n style: defaultStyle,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [event],\n (_, {focusTextBlock, style, listItem, listItemLength}) => [\n {\n type: 'text block.set',\n listItem,\n level: 1,\n style,\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: listItemLength + 1,\n },\n },\n ],\n ],\n })\n\n const markdownBehaviors = [\n automaticBlockquoteOnSpace,\n automaticHeadingOnSpace,\n automaticHr,\n automaticHrOnPaste,\n clearStyleOnBackspace,\n automaticListOnSpace,\n ]\n\n return markdownBehaviors\n}\n"],"names":["createCodeEditorBehaviors","config","defineBehavior","on","guard","context","event","isMoveUpShortcut","isHotkey","moveBlockUpShortcut","keyboardEvent","firstBlock","getFirstBlock","selectedBlocks","getSelectedBlocks","blocksAbove","node","_key","paths","map","block","path","actions","_","at","type","isMoveDownShortcut","moveBlockDownShortcut","lastBlock","getLastBlock","blocksBelow","length","reverse","createLinkBehaviors","pasteLinkOnSelection","selectionCollapsed","selectionIsCollapsed","text","data","getData","url","looksLikeUrl","undefined","annotation","linkAnnotation","schema","pasteLinkAtCaret","focusSpan","getFocusSpan","annotations","URL","createMarkdownBehaviors","automaticBlockquoteOnSpace","focusTextBlock","getFocusTextBlock","blockOffset","spanSelectionPointToBlockOffset","value","selectionPoint","offset","selection","focus","blockText","getTextBlockText","caretAtTheEndOfQuote","looksLikeMarkdownQuote","test","blockquoteStyle","style","props","anchor","automaticHr","hrCharacter","hrObject","horizontalRuleObject","focusBlock","textBefore","getBlockTextBefore","hrBlockOffsets","placement","blockObject","automaticHrOnPaste","hrRegExp","hrCharacters","match","getFocusBlock","isPortableTextTextBlock","textBlock","children","blockPath","automaticHeadingOnSpace","markdownHeadingSearch","exec","level","headingStyle","clearStyleOnBackspace","atTheBeginningOfBLock","defaultStyle","automaticListOnSpace","looksLikeUnorderedList","unorderedListStyle","caretAtTheEndOfUnorderedList","listItem","listItemLength","looksLikeOrderedList","orderedListStyle","caretAtTheEndOfOrderedList"],"mappings":"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"}
|