@prosekit/extensions 0.0.0-next-20230709094459 → 0.0.0-next-20240421132240
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 +889 -0
- package/dist/chunk-ASTUC4KT.js +111 -0
- package/dist/chunk-DYFRBXUX.js +56 -0
- package/dist/list/style.css +18 -13
- package/dist/prosekit-extensions-autocomplete.d.ts +3 -0
- package/dist/prosekit-extensions-autocomplete.js +194 -0
- package/dist/prosekit-extensions-blockquote.d.ts +3 -11
- package/dist/prosekit-extensions-blockquote.js +24 -15
- package/dist/prosekit-extensions-bold.d.ts +4 -20
- package/dist/prosekit-extensions-bold.js +35 -37
- package/dist/prosekit-extensions-code-block.d.ts +15 -0
- package/dist/prosekit-extensions-code-block.js +214 -0
- package/dist/prosekit-extensions-code.d.ts +4 -16
- package/dist/prosekit-extensions-code.js +28 -12
- package/dist/prosekit-extensions-drop-cursor.d.ts +2 -0
- package/dist/prosekit-extensions-drop-cursor.js +9 -0
- package/dist/prosekit-extensions-enter-rule.d.ts +5 -0
- package/dist/prosekit-extensions-enter-rule.js +8 -0
- package/dist/prosekit-extensions-heading.d.ts +6 -15
- package/dist/prosekit-extensions-heading.js +75 -41
- package/dist/prosekit-extensions-image.d.ts +4 -0
- package/dist/prosekit-extensions-image.js +49 -0
- package/dist/prosekit-extensions-input-rule.d.ts +3 -0
- package/dist/prosekit-extensions-input-rule.js +10 -0
- package/dist/prosekit-extensions-italic.d.ts +4 -20
- package/dist/prosekit-extensions-italic.js +29 -31
- package/dist/prosekit-extensions-link.d.ts +6 -0
- package/dist/prosekit-extensions-link.js +102 -0
- package/dist/prosekit-extensions-list.d.ts +7 -14
- package/dist/prosekit-extensions-list.js +59 -24
- package/dist/prosekit-extensions-mention.d.ts +4 -0
- package/dist/prosekit-extensions-mention.js +56 -0
- package/dist/prosekit-extensions-placeholder.d.ts +2 -23
- package/dist/prosekit-extensions-placeholder.js +11 -7
- package/dist/prosekit-extensions-readonly.d.ts +1 -0
- package/dist/prosekit-extensions-readonly.js +16 -0
- package/dist/prosekit-extensions-strike.d.ts +4 -0
- package/dist/prosekit-extensions-strike.js +47 -0
- package/dist/prosekit-extensions-table.d.ts +7 -0
- package/dist/prosekit-extensions-table.js +197 -0
- package/dist/prosekit-extensions-underline.d.ts +4 -0
- package/dist/prosekit-extensions-underline.js +45 -0
- package/dist/prosekit-extensions-virtual-selection.d.ts +1 -0
- package/dist/prosekit-extensions-virtual-selection.js +58 -0
- package/dist/prosekit-extensions.d.ts +1 -2
- package/dist/shiki-import-25BJYIO2.js +5 -0
- package/dist/table/style.css +34 -0
- package/dist/virtual-selection/style.css +6 -0
- package/package.json +119 -13
- package/dist/prosekit-extensions-suggestion.d.ts +0 -37
- package/dist/prosekit-extensions-suggestion.js +0 -159
- package/src/index.ts +0 -1
@@ -0,0 +1,111 @@
|
|
1
|
+
// src/enter-rule/index.ts
|
2
|
+
import {
|
3
|
+
Facet,
|
4
|
+
OBJECT_REPLACEMENT_CHARACTER,
|
5
|
+
getNodeType,
|
6
|
+
isTextSelection,
|
7
|
+
pluginFacet
|
8
|
+
} from "@prosekit/core";
|
9
|
+
import { keydownHandler } from "@prosekit/pm/keymap";
|
10
|
+
import {
|
11
|
+
ProseMirrorPlugin
|
12
|
+
} from "@prosekit/pm/state";
|
13
|
+
function defineEnterRule({
|
14
|
+
regex,
|
15
|
+
handler,
|
16
|
+
stop = false
|
17
|
+
}) {
|
18
|
+
const rule = new EnterRule(regex, handler, stop);
|
19
|
+
return enterRule.extension([rule]);
|
20
|
+
}
|
21
|
+
function defineTextBlockEnterRule({
|
22
|
+
regex,
|
23
|
+
type,
|
24
|
+
attrs,
|
25
|
+
stop = true
|
26
|
+
}) {
|
27
|
+
return defineEnterRule({
|
28
|
+
regex,
|
29
|
+
handler: ({ state, from, to, match }) => {
|
30
|
+
const nodeType = getNodeType(state.schema, type);
|
31
|
+
const $start = state.doc.resolve(from);
|
32
|
+
if (!$start.node(-1).canReplaceWith($start.index(-1), $start.indexAfter(-1), nodeType)) {
|
33
|
+
return null;
|
34
|
+
}
|
35
|
+
const nodeAttrs = attrs && typeof attrs === "function" ? attrs(match) : attrs;
|
36
|
+
return state.tr.delete(from, to).setBlockType(from, from, nodeType, nodeAttrs);
|
37
|
+
},
|
38
|
+
stop
|
39
|
+
});
|
40
|
+
}
|
41
|
+
var EnterRule = class {
|
42
|
+
constructor(regex, handler, stop) {
|
43
|
+
this.regex = regex;
|
44
|
+
this.handler = handler;
|
45
|
+
this.stop = stop;
|
46
|
+
}
|
47
|
+
};
|
48
|
+
var enterRule = Facet.define({
|
49
|
+
converter: () => {
|
50
|
+
let rules = [];
|
51
|
+
const command = (state, dispatch, view) => {
|
52
|
+
if (!view)
|
53
|
+
return false;
|
54
|
+
return execRules(view, rules, dispatch);
|
55
|
+
};
|
56
|
+
const handler = keydownHandler({ Enter: command });
|
57
|
+
const plugin = new ProseMirrorPlugin({ props: { handleKeyDown: handler } });
|
58
|
+
const pluginFunc = () => [plugin];
|
59
|
+
return {
|
60
|
+
create: (inputs) => {
|
61
|
+
rules = inputs;
|
62
|
+
return pluginFunc;
|
63
|
+
},
|
64
|
+
update: (inputs) => {
|
65
|
+
rules = inputs;
|
66
|
+
return null;
|
67
|
+
}
|
68
|
+
};
|
69
|
+
},
|
70
|
+
next: pluginFacet
|
71
|
+
});
|
72
|
+
function execRules(view, rules, dispatch) {
|
73
|
+
if (view.composing)
|
74
|
+
return false;
|
75
|
+
const state = view.state;
|
76
|
+
const selection = state.selection;
|
77
|
+
if (!isTextSelection(selection))
|
78
|
+
return false;
|
79
|
+
const $cursor = selection.$cursor;
|
80
|
+
if (!$cursor || $cursor.parent.type.spec.code)
|
81
|
+
return false;
|
82
|
+
const textBefore = $cursor.parent.textBetween(
|
83
|
+
Math.max(0, $cursor.parentOffset - MAX_MATCH),
|
84
|
+
$cursor.parentOffset,
|
85
|
+
null,
|
86
|
+
OBJECT_REPLACEMENT_CHARACTER
|
87
|
+
);
|
88
|
+
for (const rule of rules) {
|
89
|
+
rule.regex.lastIndex = 0;
|
90
|
+
const match = rule.regex.exec(textBefore);
|
91
|
+
const tr = match && rule.handler({
|
92
|
+
state,
|
93
|
+
from: $cursor.pos - match[0].length,
|
94
|
+
to: $cursor.pos,
|
95
|
+
match
|
96
|
+
});
|
97
|
+
if (!tr)
|
98
|
+
continue;
|
99
|
+
dispatch == null ? void 0 : dispatch(tr);
|
100
|
+
if (rule.stop) {
|
101
|
+
return true;
|
102
|
+
}
|
103
|
+
}
|
104
|
+
return false;
|
105
|
+
}
|
106
|
+
var MAX_MATCH = 200;
|
107
|
+
|
108
|
+
export {
|
109
|
+
defineEnterRule,
|
110
|
+
defineTextBlockEnterRule
|
111
|
+
};
|
@@ -0,0 +1,56 @@
|
|
1
|
+
// src/input-rule/index.ts
|
2
|
+
import {
|
3
|
+
Facet,
|
4
|
+
getNodeType,
|
5
|
+
pluginFacet
|
6
|
+
} from "@prosekit/core";
|
7
|
+
import {
|
8
|
+
inputRules,
|
9
|
+
textblockTypeInputRule,
|
10
|
+
wrappingInputRule
|
11
|
+
} from "@prosekit/pm/inputrules";
|
12
|
+
import "@prosekit/pm/model";
|
13
|
+
import "@prosekit/pm/state";
|
14
|
+
function defineInputRule(rule) {
|
15
|
+
return inputRuleFacet.extension([() => rule]);
|
16
|
+
}
|
17
|
+
function defineTextBlockInputRule({
|
18
|
+
regex,
|
19
|
+
type,
|
20
|
+
attrs
|
21
|
+
}) {
|
22
|
+
return inputRuleFacet.extension([
|
23
|
+
({ schema }) => {
|
24
|
+
const nodeType = getNodeType(schema, type);
|
25
|
+
return textblockTypeInputRule(regex, nodeType, attrs);
|
26
|
+
}
|
27
|
+
]);
|
28
|
+
}
|
29
|
+
function defineWrappingInputRule({
|
30
|
+
regex,
|
31
|
+
type,
|
32
|
+
attrs,
|
33
|
+
join
|
34
|
+
}) {
|
35
|
+
return inputRuleFacet.extension([
|
36
|
+
({ schema }) => {
|
37
|
+
const nodeType = getNodeType(schema, type);
|
38
|
+
return wrappingInputRule(regex, nodeType, attrs, join);
|
39
|
+
}
|
40
|
+
]);
|
41
|
+
}
|
42
|
+
var inputRuleFacet = Facet.define({
|
43
|
+
convert: (inputs) => {
|
44
|
+
return (context) => {
|
45
|
+
const rules = inputs.flatMap((callback) => callback(context));
|
46
|
+
return [inputRules({ rules })];
|
47
|
+
};
|
48
|
+
},
|
49
|
+
next: pluginFacet
|
50
|
+
});
|
51
|
+
|
52
|
+
export {
|
53
|
+
defineInputRule,
|
54
|
+
defineTextBlockInputRule,
|
55
|
+
defineWrappingInputRule
|
56
|
+
};
|
package/dist/list/style.css
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
/* ../../node_modules/.pnpm/prosemirror-flat-list@0.
|
1
|
+
/* ../../node_modules/.pnpm/prosemirror-flat-list@0.5.0/node_modules/prosemirror-flat-list/dist/style.css */
|
2
2
|
.prosemirror-flat-list {
|
3
3
|
padding: 0;
|
4
4
|
margin-top: 0;
|
@@ -25,25 +25,30 @@
|
|
25
25
|
.prosemirror-flat-list[data-list-kind=bullet] {
|
26
26
|
list-style: disc;
|
27
27
|
}
|
28
|
+
.prosemirror-flat-list[data-list-kind=ordered] {
|
29
|
+
counter-increment: prosemirror-flat-list-counter;
|
30
|
+
}
|
31
|
+
.prosemirror-flat-list[data-list-kind=ordered] > * {
|
32
|
+
contain: style;
|
33
|
+
}
|
28
34
|
.prosemirror-flat-list[data-list-kind=ordered]::before {
|
29
35
|
position: absolute;
|
30
36
|
right: 100%;
|
31
37
|
font-variant-numeric: tabular-nums;
|
32
38
|
content: counter(prosemirror-flat-list-counter, decimal) ". ";
|
33
39
|
}
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
counter-increment: prosemirror-flat-list-counter;
|
38
|
-
}
|
40
|
+
.prosemirror-flat-list[data-list-kind=ordered]:first-child,
|
41
|
+
:not(.prosemirror-flat-list[data-list-kind=ordered]) + .prosemirror-flat-list[data-list-kind=ordered] {
|
42
|
+
counter-reset: prosemirror-flat-list-counter;
|
39
43
|
}
|
40
|
-
@supports
|
41
|
-
.prosemirror-flat-list[data-list-kind=ordered] {
|
42
|
-
counter-
|
43
|
-
counter-increment: prosemirror-flat-list-counter;
|
44
|
+
@supports (counter-set: prosemirror-flat-list-counter 1) {
|
45
|
+
[data-list-order]:is(.prosemirror-flat-list[data-list-kind=ordered]:first-child, :not(.prosemirror-flat-list[data-list-kind=ordered]) + .prosemirror-flat-list[data-list-kind=ordered]) {
|
46
|
+
counter-set: prosemirror-flat-list-counter var(--prosemirror-flat-list-order);
|
44
47
|
}
|
45
|
-
|
46
|
-
|
48
|
+
}
|
49
|
+
@supports not (counter-set: prosemirror-flat-list-counter 1) {
|
50
|
+
[data-list-order]:is(.prosemirror-flat-list[data-list-kind=ordered]:first-child, :not(.prosemirror-flat-list[data-list-kind=ordered]) + .prosemirror-flat-list[data-list-kind=ordered]) {
|
51
|
+
counter-increment: prosemirror-flat-list-counter var(--prosemirror-flat-list-order);
|
47
52
|
}
|
48
53
|
}
|
49
54
|
.prosemirror-flat-list[data-list-kind=task] > .list-marker {
|
@@ -77,7 +82,7 @@
|
|
77
82
|
opacity: 40%;
|
78
83
|
pointer-events: none;
|
79
84
|
}
|
80
|
-
.prosemirror-flat-list[data-list-kind=toggle][data-list-collapsable][data-list-collapsed] > .list-content > *:nth-child(n
|
85
|
+
.prosemirror-flat-list[data-list-kind=toggle][data-list-collapsable][data-list-collapsed] > .list-content > *:nth-child(n+2) {
|
81
86
|
display: none;
|
82
87
|
}
|
83
88
|
|
@@ -0,0 +1,194 @@
|
|
1
|
+
// src/autocomplete/index.ts
|
2
|
+
import {
|
3
|
+
Facet,
|
4
|
+
pluginFacet
|
5
|
+
} from "@prosekit/core";
|
6
|
+
|
7
|
+
// src/autocomplete/plugin.ts
|
8
|
+
import { OBJECT_REPLACEMENT_CHARACTER } from "@prosekit/core";
|
9
|
+
import { Plugin } from "@prosekit/pm/state";
|
10
|
+
import { Decoration, DecorationSet } from "@prosekit/pm/view";
|
11
|
+
|
12
|
+
// src/autocomplete/helpers.ts
|
13
|
+
import "@prosekit/pm/model";
|
14
|
+
import { PluginKey } from "@prosekit/pm/state";
|
15
|
+
function defaultCanMatch({ state }) {
|
16
|
+
return state.selection.empty && !isInsideCode(state.selection.$from);
|
17
|
+
}
|
18
|
+
function isInsideCode($pos) {
|
19
|
+
for (let d = $pos.depth; d > 0; d--) {
|
20
|
+
if ($pos.node(d).type.spec.code) {
|
21
|
+
return true;
|
22
|
+
}
|
23
|
+
}
|
24
|
+
return $pos.marks().some((mark) => mark.type.name === "code");
|
25
|
+
}
|
26
|
+
function getPluginState(state) {
|
27
|
+
return pluginKey.getState(state);
|
28
|
+
}
|
29
|
+
function getTrMeta(tr) {
|
30
|
+
return tr.getMeta(pluginKey);
|
31
|
+
}
|
32
|
+
function setTrMeta(tr, meta) {
|
33
|
+
return tr.setMeta(pluginKey, meta);
|
34
|
+
}
|
35
|
+
var pluginKey = new PluginKey(
|
36
|
+
"prosekit-autocomplete"
|
37
|
+
);
|
38
|
+
|
39
|
+
// src/autocomplete/plugin.ts
|
40
|
+
function createAutocompletePlugin({
|
41
|
+
getRules
|
42
|
+
}) {
|
43
|
+
return new Plugin({
|
44
|
+
key: pluginKey,
|
45
|
+
state: {
|
46
|
+
init: () => {
|
47
|
+
return { active: false, ignore: null, matching: null };
|
48
|
+
},
|
49
|
+
apply: (tr, prevValue, oldState, newState) => {
|
50
|
+
var _a;
|
51
|
+
const meta = getTrMeta(tr);
|
52
|
+
if (!tr.docChanged && oldState.selection.eq(newState.selection) && !meta) {
|
53
|
+
return prevValue;
|
54
|
+
}
|
55
|
+
if (meta) {
|
56
|
+
return meta;
|
57
|
+
}
|
58
|
+
const nextValue = calcPluginState(newState, getRules());
|
59
|
+
if (nextValue.active && prevValue.ignore != null && ((_a = nextValue.matching) == null ? void 0 : _a.from) === prevValue.ignore) {
|
60
|
+
return prevValue;
|
61
|
+
}
|
62
|
+
return nextValue;
|
63
|
+
}
|
64
|
+
},
|
65
|
+
view: () => ({
|
66
|
+
update: (view, prevState) => {
|
67
|
+
var _a, _b, _c;
|
68
|
+
const prevValue = getPluginState(prevState);
|
69
|
+
const currValue = getPluginState(view.state);
|
70
|
+
if ((prevValue == null ? void 0 : prevValue.active) && prevValue.matching && prevValue.matching.rule !== ((_a = currValue == null ? void 0 : currValue.matching) == null ? void 0 : _a.rule)) {
|
71
|
+
(_c = (_b = prevValue.matching.rule).onLeave) == null ? void 0 : _c.call(_b);
|
72
|
+
}
|
73
|
+
if ((currValue == null ? void 0 : currValue.active) && currValue.matching && currValue.matching.from !== currValue.ignore) {
|
74
|
+
const { from, to, match, rule } = currValue.matching;
|
75
|
+
const textContent = view.state.doc.textBetween(
|
76
|
+
from,
|
77
|
+
to,
|
78
|
+
OBJECT_REPLACEMENT_CHARACTER
|
79
|
+
);
|
80
|
+
const deleteMatch = () => {
|
81
|
+
if (view.state.doc.textBetween(
|
82
|
+
from,
|
83
|
+
to,
|
84
|
+
OBJECT_REPLACEMENT_CHARACTER
|
85
|
+
) === textContent) {
|
86
|
+
view.dispatch(view.state.tr.delete(from, to));
|
87
|
+
}
|
88
|
+
};
|
89
|
+
const ignoreMatch = () => {
|
90
|
+
view.dispatch(
|
91
|
+
setTrMeta(view.state.tr, {
|
92
|
+
active: false,
|
93
|
+
ignore: from,
|
94
|
+
matching: null
|
95
|
+
})
|
96
|
+
);
|
97
|
+
};
|
98
|
+
rule.onMatch({
|
99
|
+
state: view.state,
|
100
|
+
match,
|
101
|
+
from,
|
102
|
+
to,
|
103
|
+
deleteMatch,
|
104
|
+
ignoreMatch
|
105
|
+
});
|
106
|
+
}
|
107
|
+
}
|
108
|
+
}),
|
109
|
+
props: {
|
110
|
+
decorations: (state) => {
|
111
|
+
const pluginState = getPluginState(state);
|
112
|
+
if ((pluginState == null ? void 0 : pluginState.active) && pluginState.matching) {
|
113
|
+
const { from, to } = pluginState.matching;
|
114
|
+
const deco = Decoration.inline(from, to, {
|
115
|
+
class: "prosemirror-prediction-match"
|
116
|
+
});
|
117
|
+
return DecorationSet.create(state.doc, [deco]);
|
118
|
+
}
|
119
|
+
return null;
|
120
|
+
}
|
121
|
+
}
|
122
|
+
});
|
123
|
+
}
|
124
|
+
var MAX_MATCH = 200;
|
125
|
+
function calcPluginState(state, rules) {
|
126
|
+
const $pos = state.selection.$from;
|
127
|
+
const parentOffset = $pos.parentOffset;
|
128
|
+
const textBefore = $pos.parent.textBetween(
|
129
|
+
Math.max(0, parentOffset - MAX_MATCH),
|
130
|
+
parentOffset,
|
131
|
+
null,
|
132
|
+
OBJECT_REPLACEMENT_CHARACTER
|
133
|
+
);
|
134
|
+
for (const rule of rules) {
|
135
|
+
if (!rule.canMatch({ state })) {
|
136
|
+
continue;
|
137
|
+
}
|
138
|
+
rule.regex.lastIndex = 0;
|
139
|
+
const match = rule.regex.exec(textBefore);
|
140
|
+
if (!match) {
|
141
|
+
continue;
|
142
|
+
}
|
143
|
+
const from = $pos.pos - textBefore.length + match.index;
|
144
|
+
return {
|
145
|
+
active: true,
|
146
|
+
ignore: null,
|
147
|
+
matching: {
|
148
|
+
rule,
|
149
|
+
match,
|
150
|
+
from,
|
151
|
+
to: $pos.pos
|
152
|
+
}
|
153
|
+
};
|
154
|
+
}
|
155
|
+
return { active: false, ignore: null, matching: null };
|
156
|
+
}
|
157
|
+
|
158
|
+
// src/autocomplete/rule.ts
|
159
|
+
var AutocompleteRule = class {
|
160
|
+
constructor(options) {
|
161
|
+
var _a;
|
162
|
+
this.regex = options.regex;
|
163
|
+
this.onMatch = options.onEnter;
|
164
|
+
this.onLeave = options.onLeave;
|
165
|
+
this.canMatch = (_a = options.canMatch) != null ? _a : defaultCanMatch;
|
166
|
+
}
|
167
|
+
};
|
168
|
+
|
169
|
+
// src/autocomplete/index.ts
|
170
|
+
function defineAutocomplete(rule) {
|
171
|
+
return autocompleteFacet.extension([rule]);
|
172
|
+
}
|
173
|
+
var autocompleteFacet = Facet.define({
|
174
|
+
converter: () => {
|
175
|
+
let localRules = [];
|
176
|
+
const getRules = () => localRules;
|
177
|
+
return {
|
178
|
+
create: (rules) => {
|
179
|
+
localRules = rules;
|
180
|
+
const plugin = createAutocompletePlugin({ getRules });
|
181
|
+
return () => [plugin];
|
182
|
+
},
|
183
|
+
update: (rules) => {
|
184
|
+
localRules = rules;
|
185
|
+
return null;
|
186
|
+
}
|
187
|
+
};
|
188
|
+
},
|
189
|
+
next: pluginFacet
|
190
|
+
});
|
191
|
+
export {
|
192
|
+
AutocompleteRule,
|
193
|
+
defineAutocomplete
|
194
|
+
};
|
@@ -1,11 +1,3 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
NODES: "blockquote";
|
5
|
-
}>;
|
6
|
-
/** @public */
|
7
|
-
declare function addBlockquote(): _prosekit_core.Extension<{
|
8
|
-
NODES: "blockquote";
|
9
|
-
}>;
|
10
|
-
|
11
|
-
export { addBlockquote, addBlockquoteSpec };
|
1
|
+
export { defineBlockquoteSpec } from './_tsup-dts-rollup';
|
2
|
+
export { defineBlockquoteInputRule } from './_tsup-dts-rollup';
|
3
|
+
export { defineBlockquote } from './_tsup-dts-rollup';
|
@@ -1,23 +1,32 @@
|
|
1
|
+
import {
|
2
|
+
defineWrappingInputRule
|
3
|
+
} from "./chunk-DYFRBXUX.js";
|
4
|
+
|
1
5
|
// src/blockquote/index.ts
|
2
|
-
import {
|
3
|
-
function
|
4
|
-
return
|
6
|
+
import { defineNodeSpec, union } from "@prosekit/core";
|
7
|
+
function defineBlockquoteSpec() {
|
8
|
+
return defineNodeSpec({
|
5
9
|
name: "blockquote",
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
return ["blockquote", 0];
|
13
|
-
}
|
10
|
+
content: "block+",
|
11
|
+
group: "block",
|
12
|
+
defining: true,
|
13
|
+
parseDOM: [{ tag: "blockquote" }],
|
14
|
+
toDOM() {
|
15
|
+
return ["blockquote", 0];
|
14
16
|
}
|
15
17
|
});
|
16
18
|
}
|
17
|
-
function
|
18
|
-
return
|
19
|
+
function defineBlockquoteInputRule() {
|
20
|
+
return defineWrappingInputRule({
|
21
|
+
regex: /^>\s/,
|
22
|
+
type: "blockquote"
|
23
|
+
});
|
24
|
+
}
|
25
|
+
function defineBlockquote() {
|
26
|
+
return union([defineBlockquoteSpec(), defineBlockquoteInputRule()]);
|
19
27
|
}
|
20
28
|
export {
|
21
|
-
|
22
|
-
|
29
|
+
defineBlockquote,
|
30
|
+
defineBlockquoteInputRule,
|
31
|
+
defineBlockquoteSpec
|
23
32
|
};
|
@@ -1,20 +1,4 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
}>;
|
6
|
-
declare function addBoldCommands(): _prosekit_core.Extension<{
|
7
|
-
COMMAND_ARGS: {
|
8
|
-
toggleBold: [];
|
9
|
-
};
|
10
|
-
}>;
|
11
|
-
declare function addBoldKeymap(): _prosekit_core.Extension<_prosekit_core.ExtensionTyping<string, string, _prosekit_core.CommandArgs>>;
|
12
|
-
/** @public */
|
13
|
-
declare function addBold(): _prosekit_core.Extension<{
|
14
|
-
MARKS: "bold";
|
15
|
-
COMMAND_ARGS: {
|
16
|
-
toggleBold: [];
|
17
|
-
};
|
18
|
-
}>;
|
19
|
-
|
20
|
-
export { addBold, addBoldCommands, addBoldKeymap, addBoldSpec };
|
1
|
+
export { defineBoldSpec } from './_tsup-dts-rollup';
|
2
|
+
export { defineBoldCommands } from './_tsup-dts-rollup';
|
3
|
+
export { defineBoldKeymap } from './_tsup-dts-rollup';
|
4
|
+
export { defineBold } from './_tsup-dts-rollup';
|
@@ -1,56 +1,54 @@
|
|
1
1
|
// src/bold/index.ts
|
2
2
|
import {
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
defineCommands,
|
4
|
+
defineKeymap,
|
5
|
+
defineMarkSpec,
|
6
|
+
union,
|
7
7
|
toggleMark
|
8
8
|
} from "@prosekit/core";
|
9
|
-
function
|
10
|
-
return
|
9
|
+
function defineBoldSpec() {
|
10
|
+
return defineMarkSpec({
|
11
11
|
name: "bold",
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
return typeof value === "string" && /^(bold(er)?|[5-9]\d{2,})$/.test(value) && null;
|
29
|
-
}
|
12
|
+
parseDOM: [
|
13
|
+
{ tag: "strong" },
|
14
|
+
// This works around a Google Docs misbehavior where
|
15
|
+
// pasted content will be inexplicably wrapped in `<b>`
|
16
|
+
// tags with a font-weight normal.
|
17
|
+
{
|
18
|
+
tag: "b",
|
19
|
+
getAttrs: (node) => {
|
20
|
+
return typeof node !== "string" && node.style.fontWeight !== "normal" && null;
|
21
|
+
}
|
22
|
+
},
|
23
|
+
{ style: "font-weight=400", clearMark: (m) => m.type.name == "strong" },
|
24
|
+
{
|
25
|
+
style: "font-weight",
|
26
|
+
getAttrs: (value) => {
|
27
|
+
return typeof value === "string" && /^(bold(er)?|[5-9]\d{2,})$/.test(value) && null;
|
30
28
|
}
|
31
|
-
],
|
32
|
-
toDOM() {
|
33
|
-
return ["em", 0];
|
34
29
|
}
|
30
|
+
],
|
31
|
+
toDOM() {
|
32
|
+
return ["strong", 0];
|
35
33
|
}
|
36
34
|
});
|
37
35
|
}
|
38
|
-
function
|
39
|
-
return
|
36
|
+
function defineBoldCommands() {
|
37
|
+
return defineCommands({
|
40
38
|
toggleBold: () => toggleMark({ type: "bold" })
|
41
39
|
});
|
42
40
|
}
|
43
|
-
function
|
44
|
-
return
|
41
|
+
function defineBoldKeymap() {
|
42
|
+
return defineKeymap({
|
45
43
|
"Mod-b": toggleMark({ type: "bold" })
|
46
44
|
});
|
47
45
|
}
|
48
|
-
function
|
49
|
-
return
|
46
|
+
function defineBold() {
|
47
|
+
return union([defineBoldSpec(), defineBoldCommands(), defineBoldKeymap()]);
|
50
48
|
}
|
51
49
|
export {
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
50
|
+
defineBold,
|
51
|
+
defineBoldCommands,
|
52
|
+
defineBoldKeymap,
|
53
|
+
defineBoldSpec
|
56
54
|
};
|
@@ -0,0 +1,15 @@
|
|
1
|
+
export { defineCodeBlock_alias_1 as defineCodeBlock } from './_tsup-dts-rollup';
|
2
|
+
export { defineCodeBlockCommands_alias_1 as defineCodeBlockCommands } from './_tsup-dts-rollup';
|
3
|
+
export { defineCodeBlockHighlight_alias_1 as defineCodeBlockHighlight } from './_tsup-dts-rollup';
|
4
|
+
export { HighlightParser_alias_1 as HighlightParser } from './_tsup-dts-rollup';
|
5
|
+
export { defineCodeBlockEnterRule_alias_1 as defineCodeBlockEnterRule } from './_tsup-dts-rollup';
|
6
|
+
export { defineCodeBlockInputRule_alias_1 as defineCodeBlockInputRule } from './_tsup-dts-rollup';
|
7
|
+
export { defineCodeBlockShiki_alias_1 as defineCodeBlockShiki } from './_tsup-dts-rollup';
|
8
|
+
export { defineCodeBlockSpec_alias_1 as defineCodeBlockSpec } from './_tsup-dts-rollup';
|
9
|
+
export { CodeBlockAttrs_alias_1 as CodeBlockAttrs } from './_tsup-dts-rollup';
|
10
|
+
export { shikiBundledLanguagesInfo } from './_tsup-dts-rollup';
|
11
|
+
export { shikiBundledThemesInfo } from './_tsup-dts-rollup';
|
12
|
+
export { ShikiBundledLanguage } from './_tsup-dts-rollup';
|
13
|
+
export { ShikiBundledLanguageInfo } from './_tsup-dts-rollup';
|
14
|
+
export { ShikiBundledTheme } from './_tsup-dts-rollup';
|
15
|
+
export { ShikiBundledThemeInfo } from './_tsup-dts-rollup';
|