@prosekit/extensions 0.5.2 → 0.5.3
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/dist/_tsup-dts-rollup.d.ts +173 -0
- package/dist/{chunk-DZAKXWWF.js → chunk-2JYT2MT7.js} +21 -41
- package/dist/{chunk-LVMTQOWG.js → chunk-PYT3MOTF.js} +14 -31
- package/dist/chunk-ZPEMHYTU.js +140 -0
- package/dist/list/style.css +4 -8
- package/dist/placeholder/style.css +1 -1
- package/dist/prosekit-extensions-autocomplete.js +33 -62
- package/dist/prosekit-extensions-blockquote.js +2 -2
- package/dist/prosekit-extensions-bold.js +3 -7
- package/dist/prosekit-extensions-code-block.js +37 -77
- package/dist/prosekit-extensions-code.js +1 -1
- package/dist/prosekit-extensions-enter-rule.js +1 -1
- package/dist/prosekit-extensions-heading.js +6 -13
- package/dist/prosekit-extensions-image.js +5 -14
- package/dist/prosekit-extensions-input-rule.js +1 -1
- package/dist/prosekit-extensions-italic.js +1 -1
- package/dist/prosekit-extensions-link.js +16 -31
- package/dist/prosekit-extensions-list.js +2 -4
- package/dist/prosekit-extensions-mark-rule.js +1 -1
- package/dist/prosekit-extensions-mention.js +4 -6
- package/dist/prosekit-extensions-placeholder.js +9 -20
- package/dist/prosekit-extensions-readonly.js +1 -1
- package/dist/prosekit-extensions-search.d.ts +3 -0
- package/dist/prosekit-extensions-search.js +382 -0
- package/dist/prosekit-extensions-strike.js +1 -1
- package/dist/prosekit-extensions-table.js +30 -68
- package/dist/prosekit-extensions-text-align.js +2 -4
- package/dist/prosekit-extensions-virtual-selection.js +6 -12
- package/dist/search/style.css +13 -0
- package/package.json +16 -5
- package/dist/chunk-ZOBSD7ZH.js +0 -189
@@ -21,7 +21,7 @@ function getFocusState(state) {
|
|
21
21
|
var virtualSelectionPlugin = new ProseMirrorPlugin({
|
22
22
|
key,
|
23
23
|
state: {
|
24
|
-
init: () =>
|
24
|
+
init: () => !1,
|
25
25
|
apply: (tr, value) => {
|
26
26
|
var _a;
|
27
27
|
return (_a = getFocusMeta(tr)) != null ? _a : value;
|
@@ -30,22 +30,16 @@ var virtualSelectionPlugin = new ProseMirrorPlugin({
|
|
30
30
|
props: {
|
31
31
|
handleDOMEvents: {
|
32
32
|
focus: (view) => {
|
33
|
-
view.dispatch(setFocusMeta(view.state.tr,
|
33
|
+
view.dispatch(setFocusMeta(view.state.tr, !1));
|
34
34
|
},
|
35
35
|
blur: (view) => {
|
36
|
-
|
37
|
-
|
38
|
-
if (activeElement === dom)
|
39
|
-
return;
|
40
|
-
view.dispatch(setFocusMeta(view.state.tr, true));
|
36
|
+
let { dom, root } = view;
|
37
|
+
root.activeElement !== dom && view.dispatch(setFocusMeta(view.state.tr, !0));
|
41
38
|
}
|
42
39
|
},
|
43
40
|
decorations: (state) => {
|
44
|
-
|
45
|
-
|
46
|
-
return null;
|
47
|
-
}
|
48
|
-
return DecorationSet.create(doc, [
|
41
|
+
let { selection, doc } = state;
|
42
|
+
return selection.empty || !getFocusState(state) ? null : DecorationSet.create(doc, [
|
49
43
|
Decoration.inline(selection.from, selection.to, {
|
50
44
|
class: "prosekit-virtual-selection"
|
51
45
|
})
|
@@ -0,0 +1,13 @@
|
|
1
|
+
/* src/search/style.css */
|
2
|
+
.ProseMirror-search-match {
|
3
|
+
background-color: #ffff0054;
|
4
|
+
box-shadow: 0 0 0 2px #ffff0054;
|
5
|
+
border-radius: 2px;
|
6
|
+
}
|
7
|
+
.ProseMirror.ProseMirror-focused .ProseMirror-active-search-match::selection,
|
8
|
+
.ProseMirror:not(.ProseMirror-focused) .ProseMirror-active-search-match {
|
9
|
+
background-color: #ff6a0054;
|
10
|
+
box-shadow: 0 0 0 2px #ff6a0054;
|
11
|
+
border-radius: 2px;
|
12
|
+
scroll-margin: 8px;
|
13
|
+
}
|
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "@prosekit/extensions",
|
3
3
|
"type": "module",
|
4
|
-
"version": "0.5.
|
4
|
+
"version": "0.5.3",
|
5
5
|
"private": false,
|
6
6
|
"author": {
|
7
7
|
"name": "ocavue",
|
@@ -126,6 +126,14 @@
|
|
126
126
|
"import": "./dist/prosekit-extensions-readonly.js",
|
127
127
|
"default": "./dist/prosekit-extensions-readonly.js"
|
128
128
|
},
|
129
|
+
"./search": {
|
130
|
+
"types": "./dist/prosekit-extensions-search.d.ts",
|
131
|
+
"import": "./dist/prosekit-extensions-search.js",
|
132
|
+
"default": "./dist/prosekit-extensions-search.js"
|
133
|
+
},
|
134
|
+
"./search/style.css": {
|
135
|
+
"default": "./dist/search/style.css"
|
136
|
+
},
|
129
137
|
"./strike": {
|
130
138
|
"types": "./dist/prosekit-extensions-strike.d.ts",
|
131
139
|
"import": "./dist/prosekit-extensions-strike.js",
|
@@ -162,16 +170,16 @@
|
|
162
170
|
"dist"
|
163
171
|
],
|
164
172
|
"dependencies": {
|
165
|
-
"@prosekit/core": "^0.5.4",
|
166
|
-
"@prosekit/pm": "^0.1.4",
|
167
173
|
"prosemirror-dropcursor": "^1.8.1",
|
168
174
|
"prosemirror-flat-list": "^0.5.0",
|
169
175
|
"prosemirror-highlight": "^0.6.0",
|
170
176
|
"prosemirror-tables": "^1.3.7",
|
171
|
-
"shiki": "^1.6.
|
177
|
+
"shiki": "^1.6.2",
|
178
|
+
"@prosekit/core": "^0.5.5",
|
179
|
+
"@prosekit/pm": "^0.1.5"
|
172
180
|
},
|
173
181
|
"devDependencies": {
|
174
|
-
"tsup": "^8.0
|
182
|
+
"tsup": "^8.1.0",
|
175
183
|
"typescript": "^5.4.5",
|
176
184
|
"vitest": "^1.6.0",
|
177
185
|
"@prosekit/dev": "0.0.0"
|
@@ -240,6 +248,9 @@
|
|
240
248
|
"readonly": [
|
241
249
|
"./dist/prosekit-extensions-readonly.d.ts"
|
242
250
|
],
|
251
|
+
"search": [
|
252
|
+
"./dist/prosekit-extensions-search.d.ts"
|
253
|
+
],
|
243
254
|
"strike": [
|
244
255
|
"./dist/prosekit-extensions-strike.d.ts"
|
245
256
|
],
|
package/dist/chunk-ZOBSD7ZH.js
DELETED
@@ -1,189 +0,0 @@
|
|
1
|
-
// src/mark-rule/extension.ts
|
2
|
-
import {
|
3
|
-
defineFacet,
|
4
|
-
defineFacetPayload,
|
5
|
-
pluginFacet
|
6
|
-
} from "@prosekit/core";
|
7
|
-
import {
|
8
|
-
PluginKey,
|
9
|
-
ProseMirrorPlugin
|
10
|
-
} from "@prosekit/pm/state";
|
11
|
-
|
12
|
-
// src/mark-rule/apply.ts
|
13
|
-
import {
|
14
|
-
OBJECT_REPLACEMENT_CHARACTER,
|
15
|
-
getMarkType,
|
16
|
-
maybeRun
|
17
|
-
} from "@prosekit/core";
|
18
|
-
import "@prosekit/pm/model";
|
19
|
-
import "@prosekit/pm/state";
|
20
|
-
|
21
|
-
// src/mark-rule/range.ts
|
22
|
-
import "@prosekit/pm/state";
|
23
|
-
function getSpanTextRanges($from, $to) {
|
24
|
-
const nodeRange = $from.blockRange($to);
|
25
|
-
if (!nodeRange) {
|
26
|
-
return [];
|
27
|
-
}
|
28
|
-
const stack = [];
|
29
|
-
let start = nodeRange.start;
|
30
|
-
for (let i = nodeRange.startIndex; i < nodeRange.endIndex; i++) {
|
31
|
-
const child = nodeRange.parent.child(i);
|
32
|
-
stack.push([start, child]);
|
33
|
-
start += child.nodeSize;
|
34
|
-
}
|
35
|
-
const ranges = [];
|
36
|
-
while (stack.length > 0) {
|
37
|
-
const [start2, node] = stack.pop();
|
38
|
-
if (node.type.spec.code) {
|
39
|
-
continue;
|
40
|
-
}
|
41
|
-
if (node.type.isTextblock) {
|
42
|
-
ranges.push([start2 + 1, start2 + 1 + node.content.size]);
|
43
|
-
continue;
|
44
|
-
}
|
45
|
-
node.forEach((child, offset) => {
|
46
|
-
stack.push([start2 + offset + 1, child]);
|
47
|
-
});
|
48
|
-
}
|
49
|
-
return ranges;
|
50
|
-
}
|
51
|
-
function getInlineTextRange($from, $to) {
|
52
|
-
return [$from.start(), $to.end()];
|
53
|
-
}
|
54
|
-
function getTextRanges(doc, from, to) {
|
55
|
-
const $from = doc.resolve(from);
|
56
|
-
const $to = doc.resolve(to);
|
57
|
-
if ($from.sameParent($to) && $from.parent.isTextblock) {
|
58
|
-
return [getInlineTextRange($from, $to)];
|
59
|
-
} else {
|
60
|
-
const nodeRange = $from.blockRange($to);
|
61
|
-
if (!nodeRange) {
|
62
|
-
return [];
|
63
|
-
}
|
64
|
-
return getSpanTextRanges($from, $to);
|
65
|
-
}
|
66
|
-
}
|
67
|
-
function getMapRange(transactions, oldState, newState) {
|
68
|
-
let lo = oldState.selection.from;
|
69
|
-
let hi = oldState.selection.to;
|
70
|
-
for (const tr of transactions) {
|
71
|
-
for (const map of tr.mapping.maps) {
|
72
|
-
lo = map.map(lo);
|
73
|
-
hi = map.map(hi);
|
74
|
-
map.forEach((_oldStart, _oldEnd, newStart, newEnd) => {
|
75
|
-
lo = Math.min(lo, hi, newStart);
|
76
|
-
hi = Math.max(lo, hi, newEnd);
|
77
|
-
});
|
78
|
-
}
|
79
|
-
}
|
80
|
-
lo = Math.min(lo, hi, newState.selection.from);
|
81
|
-
hi = Math.min(lo, hi, newState.selection.to);
|
82
|
-
return [lo, hi];
|
83
|
-
}
|
84
|
-
function getCheckRanges(transactions, oldState, newState) {
|
85
|
-
const [from, to] = getMapRange(transactions, oldState, newState);
|
86
|
-
return getTextRanges(newState.doc, from, to);
|
87
|
-
}
|
88
|
-
|
89
|
-
// src/mark-rule/apply.ts
|
90
|
-
function getExpectedMarkings(rules, doc, from, to) {
|
91
|
-
const text = doc.textBetween(from, to, null, OBJECT_REPLACEMENT_CHARACTER);
|
92
|
-
const ranges = [];
|
93
|
-
for (const rule of rules) {
|
94
|
-
rule.regex.lastIndex = 0;
|
95
|
-
const matches = text.matchAll(rule.regex);
|
96
|
-
const markType = getMarkType(doc.type.schema, rule.type);
|
97
|
-
for (const match of matches) {
|
98
|
-
const index = match.index;
|
99
|
-
if (index == null)
|
100
|
-
continue;
|
101
|
-
const attrs = maybeRun(rule.attrs, match);
|
102
|
-
const mark = markType.create(attrs);
|
103
|
-
ranges.push([from + index, from + index + match[0].length, mark]);
|
104
|
-
}
|
105
|
-
}
|
106
|
-
ranges.sort((a, b) => a[0] - b[0] || b[1] - a[1]);
|
107
|
-
const result = [];
|
108
|
-
let freeIndex = 0;
|
109
|
-
for (const range of ranges) {
|
110
|
-
if (range[0] >= freeIndex) {
|
111
|
-
result.push(range);
|
112
|
-
freeIndex = range[1];
|
113
|
-
}
|
114
|
-
}
|
115
|
-
return result;
|
116
|
-
}
|
117
|
-
function getReceivedMarkings(rules, doc, from, to) {
|
118
|
-
const result = [];
|
119
|
-
const schema = doc.type.schema;
|
120
|
-
const markTypes = rules.map((rule) => getMarkType(schema, rule.type));
|
121
|
-
doc.nodesBetween(from, to, (node, pos) => {
|
122
|
-
if (!node.isInline) {
|
123
|
-
return;
|
124
|
-
}
|
125
|
-
for (const markType of markTypes) {
|
126
|
-
const mark = node.marks.find((mark2) => mark2.type === markType);
|
127
|
-
if (mark) {
|
128
|
-
result.push([pos, pos + node.nodeSize, mark]);
|
129
|
-
}
|
130
|
-
}
|
131
|
-
});
|
132
|
-
return result;
|
133
|
-
}
|
134
|
-
function markRangeEquals(a, b) {
|
135
|
-
return a[0] === b[0] && a[1] === b[1] && a[2].eq(b[2]);
|
136
|
-
}
|
137
|
-
function markRangeDiffs(a, b) {
|
138
|
-
return a.filter((x) => !b.some((y) => markRangeEquals(x, y)));
|
139
|
-
}
|
140
|
-
function applyMarkRules(rules, transactions, oldState, newState) {
|
141
|
-
if (transactions.length === 0 || transactions.every((tr2) => !tr2.docChanged)) {
|
142
|
-
return null;
|
143
|
-
}
|
144
|
-
const ranges = getCheckRanges(transactions, oldState, newState);
|
145
|
-
const toRemove = [];
|
146
|
-
const toCreate = [];
|
147
|
-
for (const [from, to] of ranges) {
|
148
|
-
const expected = getExpectedMarkings(rules, newState.doc, from, to);
|
149
|
-
const received = getReceivedMarkings(rules, newState.doc, from, to);
|
150
|
-
toRemove.push(...markRangeDiffs(received, expected));
|
151
|
-
toCreate.push(...markRangeDiffs(expected, received));
|
152
|
-
}
|
153
|
-
if (toCreate.length === 0 && toRemove.length === 0) {
|
154
|
-
return null;
|
155
|
-
}
|
156
|
-
const tr = newState.tr;
|
157
|
-
for (const [from, to, mark] of toRemove) {
|
158
|
-
tr.removeMark(from, to, mark);
|
159
|
-
}
|
160
|
-
for (const [from, to, mark] of toCreate) {
|
161
|
-
tr.addMark(from, to, mark);
|
162
|
-
}
|
163
|
-
return tr;
|
164
|
-
}
|
165
|
-
|
166
|
-
// src/mark-rule/extension.ts
|
167
|
-
function defineMarkRule(options) {
|
168
|
-
return defineFacetPayload(markRuleFacet, [options]);
|
169
|
-
}
|
170
|
-
var markRuleFacet = defineFacet({
|
171
|
-
reduce: () => {
|
172
|
-
let rules = [];
|
173
|
-
const plugin = new ProseMirrorPlugin({
|
174
|
-
key: new PluginKey("prosekit-mark-rule"),
|
175
|
-
appendTransaction: (transactions, oldState, newState) => {
|
176
|
-
return applyMarkRules(rules, transactions, oldState, newState);
|
177
|
-
}
|
178
|
-
});
|
179
|
-
return function reducer(input) {
|
180
|
-
rules = input;
|
181
|
-
return plugin;
|
182
|
-
};
|
183
|
-
},
|
184
|
-
parent: pluginFacet
|
185
|
-
});
|
186
|
-
|
187
|
-
export {
|
188
|
-
defineMarkRule
|
189
|
-
};
|