@prosekit/extensions 0.16.0-beta.0 → 0.16.0-beta.1
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/{prosekit-extensions-autocomplete.d.ts → autocomplete.d.ts} +1 -6
- package/dist/autocomplete.d.ts.map +1 -0
- package/dist/{prosekit-extensions-autocomplete.js → autocomplete.js} +1 -9
- package/dist/autocomplete.js.map +1 -0
- package/dist/{prosekit-extensions-background-color.d.ts → background-color.d.ts} +1 -8
- package/dist/background-color.d.ts.map +1 -0
- package/dist/{prosekit-extensions-background-color.js → background-color.js} +1 -7
- package/dist/background-color.js.map +1 -0
- package/dist/{prosekit-extensions-blockquote.d.ts → blockquote.d.ts} +1 -12
- package/dist/blockquote.d.ts.map +1 -0
- package/dist/{prosekit-extensions-blockquote.js → blockquote.js} +2 -12
- package/dist/blockquote.js.map +1 -0
- package/dist/{prosekit-extensions-bold.d.ts → bold.d.ts} +1 -12
- package/dist/bold.d.ts.map +1 -0
- package/dist/{prosekit-extensions-bold.js → bold.js} +2 -12
- package/dist/bold.js.map +1 -0
- package/dist/{prosekit-extensions-code-block.d.ts → code-block.d.ts} +1 -20
- package/dist/code-block.d.ts.map +1 -0
- package/dist/{prosekit-extensions-code-block.js → code-block.js} +3 -21
- package/dist/code-block.js.map +1 -0
- package/dist/{prosekit-extensions-code.d.ts → code.d.ts} +1 -12
- package/dist/code.d.ts.map +1 -0
- package/dist/{prosekit-extensions-code.js → code.js} +2 -12
- package/dist/code.js.map +1 -0
- package/dist/{prosekit-extensions-commit.d.ts → commit.d.ts} +1 -4
- package/dist/commit.d.ts.map +1 -0
- package/dist/{prosekit-extensions-commit.js → commit.js} +1 -3
- package/dist/commit.js.map +1 -0
- package/dist/{prosekit-extensions-doc.d.ts → doc.d.ts} +1 -4
- package/dist/doc.d.ts.map +1 -0
- package/dist/{prosekit-extensions-doc.js → doc.js} +1 -3
- package/dist/doc.js.map +1 -0
- package/dist/{prosekit-extensions-drop-cursor.d.ts → drop-cursor.d.ts} +1 -4
- package/dist/drop-cursor.d.ts.map +1 -0
- package/dist/{prosekit-extensions-drop-cursor.js → drop-cursor.js} +1 -3
- package/dist/drop-cursor.js.map +1 -0
- package/dist/{prosekit-extensions-drop-indicator.d.ts → drop-indicator.d.ts} +1 -4
- package/dist/drop-indicator.d.ts.map +1 -0
- package/dist/drop-indicator.js +2 -57
- package/dist/drop-indicator2.js +53 -0
- package/dist/drop-indicator2.js.map +1 -0
- package/dist/{prosekit-extensions-enter-rule.d.ts → enter-rule.d.ts} +1 -4
- package/dist/enter-rule.d.ts.map +1 -0
- package/dist/{prosekit-extensions-enter-rule.js → enter-rule.js} +1 -3
- package/dist/enter-rule.js.map +1 -0
- package/dist/file.js +2 -128
- package/dist/file2.js +120 -0
- package/dist/file2.js.map +1 -0
- package/dist/{prosekit-extensions-gap-cursor.d.ts → gap-cursor.d.ts} +1 -4
- package/dist/gap-cursor.d.ts.map +1 -0
- package/dist/{prosekit-extensions-gap-cursor.js → gap-cursor.js} +1 -3
- package/dist/gap-cursor.js.map +1 -0
- package/dist/{prosekit-extensions-hard-break.d.ts → hard-break.d.ts} +1 -10
- package/dist/hard-break.d.ts.map +1 -0
- package/dist/{prosekit-extensions-hard-break.js → hard-break.js} +1 -9
- package/dist/hard-break.js.map +1 -0
- package/dist/{prosekit-extensions-heading.d.ts → heading.d.ts} +1 -14
- package/dist/heading.d.ts.map +1 -0
- package/dist/{prosekit-extensions-heading.js → heading.js} +2 -12
- package/dist/heading.js.map +1 -0
- package/dist/{prosekit-extensions-horizontal-rule.d.ts → horizontal-rule.d.ts} +1 -10
- package/dist/horizontal-rule.d.ts.map +1 -0
- package/dist/{prosekit-extensions-horizontal-rule.js → horizontal-rule.js} +2 -10
- package/dist/horizontal-rule.js.map +1 -0
- package/dist/{prosekit-extensions-image.d.ts → image.d.ts} +1 -14
- package/dist/image.d.ts.map +1 -0
- package/dist/{prosekit-extensions-image.js → image.js} +2 -14
- package/dist/image.js.map +1 -0
- package/dist/index.d.ts +0 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/{prosekit-extensions-input-rule.d.ts → input-rule.d.ts} +1 -4
- package/dist/input-rule.d.ts.map +1 -0
- package/dist/{prosekit-extensions-input-rule.js → input-rule.js} +1 -3
- package/dist/input-rule.js.map +1 -0
- package/dist/{prosekit-extensions-italic.d.ts → italic.d.ts} +1 -12
- package/dist/italic.d.ts.map +1 -0
- package/dist/{prosekit-extensions-italic.js → italic.js} +2 -12
- package/dist/italic.js.map +1 -0
- package/dist/{prosekit-extensions-link.d.ts → link.d.ts} +1 -8
- package/dist/link.d.ts.map +1 -0
- package/dist/{prosekit-extensions-link.js → link.js} +5 -11
- package/dist/link.js.map +1 -0
- package/dist/{prosekit-extensions-list.d.ts → list.d.ts} +1 -18
- package/dist/list.d.ts.map +1 -0
- package/dist/{prosekit-extensions-list.js → list.js} +3 -19
- package/dist/list.js.map +1 -0
- package/dist/{prosekit-extensions-loro.d.ts → loro.d.ts} +1 -14
- package/dist/loro.d.ts.map +1 -0
- package/dist/{prosekit-extensions-loro.js → loro.js} +1 -13
- package/dist/loro.js.map +1 -0
- package/dist/{prosekit-extensions-mark-rule.d.ts → mark-rule.d.ts} +1 -6
- package/dist/mark-rule.d.ts.map +1 -0
- package/dist/mark-rule.js +2 -157
- package/dist/mark-rule2.js +151 -0
- package/dist/mark-rule2.js.map +1 -0
- package/dist/{prosekit-extensions-math.d.ts → math.d.ts} +1 -10
- package/dist/math.d.ts.map +1 -0
- package/dist/{prosekit-extensions-math.js → math.js} +3 -11
- package/dist/math.js.map +1 -0
- package/dist/{prosekit-extensions-mention.d.ts → mention.d.ts} +1 -4
- package/dist/mention.d.ts.map +1 -0
- package/dist/{prosekit-extensions-mention.js → mention.js} +1 -3
- package/dist/mention.js.map +1 -0
- package/dist/{prosekit-extensions-mod-click-prevention.d.ts → mod-click-prevention.d.ts} +1 -4
- package/dist/mod-click-prevention.d.ts.map +1 -0
- package/dist/{prosekit-extensions-mod-click-prevention.js → mod-click-prevention.js} +1 -3
- package/dist/mod-click-prevention.js.map +1 -0
- package/dist/{prosekit-extensions-page.d.ts → page.d.ts} +1 -12
- package/dist/page.d.ts.map +1 -0
- package/dist/{prosekit-extensions-page.js → page.js} +3 -15
- package/dist/page.js.map +1 -0
- package/dist/{prosekit-extensions-paragraph.d.ts → paragraph.d.ts} +1 -10
- package/dist/paragraph.d.ts.map +1 -0
- package/dist/{prosekit-extensions-paragraph.js → paragraph.js} +1 -9
- package/dist/paragraph.js.map +1 -0
- package/dist/{prosekit-extensions-paste-rule.d.ts → paste-rule.d.ts} +1 -6
- package/dist/paste-rule.d.ts.map +1 -0
- package/dist/paste-rule.js +2 -158
- package/dist/paste-rule2.js +150 -0
- package/dist/paste-rule2.js.map +1 -0
- package/dist/{prosekit-extensions-placeholder.d.ts → placeholder.d.ts} +1 -4
- package/dist/placeholder.d.ts.map +1 -0
- package/dist/{prosekit-extensions-placeholder.js → placeholder.js} +2 -4
- package/dist/placeholder.js.map +1 -0
- package/dist/{prosekit-extensions-readonly.d.ts → readonly.d.ts} +1 -4
- package/dist/readonly.d.ts.map +1 -0
- package/dist/{prosekit-extensions-readonly.js → readonly.js} +6 -3
- package/dist/readonly.js.map +1 -0
- package/dist/{prosekit-extensions-search.d.ts → search.d.ts} +1 -4
- package/dist/search.d.ts.map +1 -0
- package/dist/{prosekit-extensions-search.js → search.js} +1 -3
- package/dist/search.js.map +1 -0
- package/dist/shiki-highlighter-chunk.js +0 -2
- package/dist/shiki-highlighter-chunk.js.map +1 -1
- package/dist/{prosekit-extensions-strike.d.ts → strike.d.ts} +1 -4
- package/dist/strike.d.ts.map +1 -0
- package/dist/{prosekit-extensions-strike.js → strike.js} +2 -4
- package/dist/strike.js.map +1 -0
- package/dist/{prosekit-extensions-table.d.ts → table.d.ts} +1 -26
- package/dist/table.d.ts.map +1 -0
- package/dist/table.js +2 -276
- package/dist/table2.js +252 -0
- package/dist/table2.js.map +1 -0
- package/dist/{prosekit-extensions-text-align.d.ts → text-align.d.ts} +1 -4
- package/dist/text-align.d.ts.map +1 -0
- package/dist/{prosekit-extensions-text-align.js → text-align.js} +1 -3
- package/dist/text-align.js.map +1 -0
- package/dist/{prosekit-extensions-text-color.d.ts → text-color.d.ts} +1 -8
- package/dist/text-color.d.ts.map +1 -0
- package/dist/{prosekit-extensions-text-color.js → text-color.js} +1 -7
- package/dist/text-color.js.map +1 -0
- package/dist/{prosekit-extensions-text.d.ts → text.d.ts} +1 -4
- package/dist/text.d.ts.map +1 -0
- package/dist/{prosekit-extensions-text.js → text.js} +1 -3
- package/dist/text.js.map +1 -0
- package/dist/{prosekit-extensions-underline.d.ts → underline.d.ts} +1 -4
- package/dist/underline.d.ts.map +1 -0
- package/dist/{prosekit-extensions-underline.js → underline.js} +1 -3
- package/dist/underline.js.map +1 -0
- package/dist/{prosekit-extensions-virtual-selection.d.ts → virtual-selection.d.ts} +1 -4
- package/dist/virtual-selection.d.ts.map +1 -0
- package/dist/{prosekit-extensions-virtual-selection.js → virtual-selection.js} +1 -3
- package/dist/virtual-selection.js.map +1 -0
- package/dist/{prosekit-extensions-yjs.d.ts → yjs.d.ts} +1 -16
- package/dist/yjs.d.ts.map +1 -0
- package/dist/{prosekit-extensions-yjs.js → yjs.js} +1 -13
- package/dist/yjs.js.map +1 -0
- package/package.json +137 -195
- package/src/page/page-element.ts +2 -2
- package/src/readonly/index.ts +6 -0
- package/dist/drop-indicator.js.map +0 -1
- package/dist/file.js.map +0 -1
- package/dist/mark-rule.js.map +0 -1
- package/dist/paste-rule.js.map +0 -1
- package/dist/prosekit-extensions-autocomplete.d.ts.map +0 -1
- package/dist/prosekit-extensions-autocomplete.js.map +0 -1
- package/dist/prosekit-extensions-background-color.d.ts.map +0 -1
- package/dist/prosekit-extensions-background-color.js.map +0 -1
- package/dist/prosekit-extensions-blockquote.d.ts.map +0 -1
- package/dist/prosekit-extensions-blockquote.js.map +0 -1
- package/dist/prosekit-extensions-bold.d.ts.map +0 -1
- package/dist/prosekit-extensions-bold.js.map +0 -1
- package/dist/prosekit-extensions-code-block.d.ts.map +0 -1
- package/dist/prosekit-extensions-code-block.js.map +0 -1
- package/dist/prosekit-extensions-code.d.ts.map +0 -1
- package/dist/prosekit-extensions-code.js.map +0 -1
- package/dist/prosekit-extensions-commit.d.ts.map +0 -1
- package/dist/prosekit-extensions-commit.js.map +0 -1
- package/dist/prosekit-extensions-doc.d.ts.map +0 -1
- package/dist/prosekit-extensions-doc.js.map +0 -1
- package/dist/prosekit-extensions-drop-cursor.d.ts.map +0 -1
- package/dist/prosekit-extensions-drop-cursor.js.map +0 -1
- package/dist/prosekit-extensions-drop-indicator.d.ts.map +0 -1
- package/dist/prosekit-extensions-drop-indicator.js +0 -2
- package/dist/prosekit-extensions-enter-rule.d.ts.map +0 -1
- package/dist/prosekit-extensions-enter-rule.js.map +0 -1
- package/dist/prosekit-extensions-file.js +0 -2
- package/dist/prosekit-extensions-gap-cursor.d.ts.map +0 -1
- package/dist/prosekit-extensions-gap-cursor.js.map +0 -1
- package/dist/prosekit-extensions-hard-break.d.ts.map +0 -1
- package/dist/prosekit-extensions-hard-break.js.map +0 -1
- package/dist/prosekit-extensions-heading.d.ts.map +0 -1
- package/dist/prosekit-extensions-heading.js.map +0 -1
- package/dist/prosekit-extensions-horizontal-rule.d.ts.map +0 -1
- package/dist/prosekit-extensions-horizontal-rule.js.map +0 -1
- package/dist/prosekit-extensions-image.d.ts.map +0 -1
- package/dist/prosekit-extensions-image.js.map +0 -1
- package/dist/prosekit-extensions-input-rule.d.ts.map +0 -1
- package/dist/prosekit-extensions-input-rule.js.map +0 -1
- package/dist/prosekit-extensions-italic.d.ts.map +0 -1
- package/dist/prosekit-extensions-italic.js.map +0 -1
- package/dist/prosekit-extensions-link.d.ts.map +0 -1
- package/dist/prosekit-extensions-link.js.map +0 -1
- package/dist/prosekit-extensions-list.d.ts.map +0 -1
- package/dist/prosekit-extensions-list.js.map +0 -1
- package/dist/prosekit-extensions-loro.d.ts.map +0 -1
- package/dist/prosekit-extensions-loro.js.map +0 -1
- package/dist/prosekit-extensions-mark-rule.d.ts.map +0 -1
- package/dist/prosekit-extensions-mark-rule.js +0 -2
- package/dist/prosekit-extensions-math.d.ts.map +0 -1
- package/dist/prosekit-extensions-math.js.map +0 -1
- package/dist/prosekit-extensions-mention.d.ts.map +0 -1
- package/dist/prosekit-extensions-mention.js.map +0 -1
- package/dist/prosekit-extensions-mod-click-prevention.d.ts.map +0 -1
- package/dist/prosekit-extensions-mod-click-prevention.js.map +0 -1
- package/dist/prosekit-extensions-page.d.ts.map +0 -1
- package/dist/prosekit-extensions-page.js.map +0 -1
- package/dist/prosekit-extensions-paragraph.d.ts.map +0 -1
- package/dist/prosekit-extensions-paragraph.js.map +0 -1
- package/dist/prosekit-extensions-paste-rule.d.ts.map +0 -1
- package/dist/prosekit-extensions-paste-rule.js +0 -2
- package/dist/prosekit-extensions-placeholder.d.ts.map +0 -1
- package/dist/prosekit-extensions-placeholder.js.map +0 -1
- package/dist/prosekit-extensions-readonly.d.ts.map +0 -1
- package/dist/prosekit-extensions-readonly.js.map +0 -1
- package/dist/prosekit-extensions-search.d.ts.map +0 -1
- package/dist/prosekit-extensions-search.js.map +0 -1
- package/dist/prosekit-extensions-strike.d.ts.map +0 -1
- package/dist/prosekit-extensions-strike.js.map +0 -1
- package/dist/prosekit-extensions-table.d.ts.map +0 -1
- package/dist/prosekit-extensions-table.js +0 -2
- package/dist/prosekit-extensions-text-align.d.ts.map +0 -1
- package/dist/prosekit-extensions-text-align.js.map +0 -1
- package/dist/prosekit-extensions-text-color.d.ts.map +0 -1
- package/dist/prosekit-extensions-text-color.js.map +0 -1
- package/dist/prosekit-extensions-text.d.ts.map +0 -1
- package/dist/prosekit-extensions-text.js.map +0 -1
- package/dist/prosekit-extensions-underline.d.ts.map +0 -1
- package/dist/prosekit-extensions-underline.js.map +0 -1
- package/dist/prosekit-extensions-virtual-selection.d.ts.map +0 -1
- package/dist/prosekit-extensions-virtual-selection.js.map +0 -1
- package/dist/prosekit-extensions-yjs.d.ts.map +0 -1
- package/dist/prosekit-extensions-yjs.js.map +0 -1
- package/dist/table.js.map +0 -1
- /package/dist/{prosekit-extensions-file.d.ts → file.d.ts} +0 -0
- /package/dist/{prosekit-extensions.js → index.js} +0 -0
- /package/dist/{prosekit-extensions.d.ts → index2.d.ts} +0 -0
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { Command } from "@prosekit/pm/state";
|
|
2
2
|
import { Extension, PlainExtension, Union } from "@prosekit/core";
|
|
3
3
|
import { Attrs } from "@prosekit/pm/model";
|
|
4
|
-
|
|
5
|
-
//#region src/page/page-break-commands.d.ts
|
|
6
4
|
/**
|
|
7
5
|
* @internal
|
|
8
6
|
*/
|
|
@@ -19,8 +17,6 @@ declare function insertPageBreak(): Command;
|
|
|
19
17
|
* @internal
|
|
20
18
|
*/
|
|
21
19
|
declare function definePageBreakCommands(): PageBreakCommandsExtension;
|
|
22
|
-
//#endregion
|
|
23
|
-
//#region src/page/page-break-keymap.d.ts
|
|
24
20
|
/**
|
|
25
21
|
* @internal
|
|
26
22
|
*/
|
|
@@ -29,8 +25,6 @@ type PageBreakKeymapExtension = PlainExtension;
|
|
|
29
25
|
* @internal
|
|
30
26
|
*/
|
|
31
27
|
declare function definePageBreakKeymap(): PageBreakKeymapExtension;
|
|
32
|
-
//#endregion
|
|
33
|
-
//#region src/page/page-break-spec.d.ts
|
|
34
28
|
/**
|
|
35
29
|
* @internal
|
|
36
30
|
*/
|
|
@@ -48,8 +42,6 @@ declare module '@prosekit/pm/model' {
|
|
|
48
42
|
pageBreak?: boolean | undefined;
|
|
49
43
|
}
|
|
50
44
|
} //# sourceMappingURL=page-break-spec.d.ts.map
|
|
51
|
-
//#endregion
|
|
52
|
-
//#region src/page/page-break.d.ts
|
|
53
45
|
/**
|
|
54
46
|
* @internal
|
|
55
47
|
*/
|
|
@@ -58,8 +50,6 @@ type PageBreakExtension = Union<[PageBreakSpecExtension, PageBreakCommandsExtens
|
|
|
58
50
|
* @public
|
|
59
51
|
*/
|
|
60
52
|
declare function definePageBreak(): PageBreakExtension;
|
|
61
|
-
//#endregion
|
|
62
|
-
//#region src/page/page-rendering.d.ts
|
|
63
53
|
/**
|
|
64
54
|
* @public
|
|
65
55
|
*/
|
|
@@ -109,6 +99,5 @@ declare function definePageRendering(options?: PageRenderingOptions): PageRender
|
|
|
109
99
|
* @internal
|
|
110
100
|
*/
|
|
111
101
|
type PageRenderingExtension = Extension;
|
|
112
|
-
//#endregion
|
|
113
102
|
export { type PageBreakCommandsExtension, type PageBreakExtension, type PageBreakKeymapExtension, type PageBreakSpecExtension, type PageRenderingExtension, type PageRenderingOptions, definePageBreak, definePageBreakCommands, definePageBreakKeymap, definePageBreakSpec, definePageRendering, insertPageBreak };
|
|
114
|
-
//# sourceMappingURL=
|
|
103
|
+
//# sourceMappingURL=page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.d.ts","names":[],"sources":["../src/page/page-break-commands.ts","../src/page/page-break-keymap.ts","../src/page/page-break-spec.ts","../src/page/page-break.ts","../src/page/page-rendering.ts"],"mappings":";;;;;AAOA;KAAY,0BAAA,GAA6B,SAAA;EACvC,QAAA;IACE,eAAA;EAAA;AAAA;;;;iBAoBY,eAAA,CAAA,GAAmB,OAAA;;;;iBAOnB,uBAAA,CAAA,GAA2B,0BAAA;;;;KC7B/B,wBAAA,GAA2B,cAAA;;;;iBAKvB,qBAAA,CAAA,GAAyB,wBAAA;;;ADLzC;KEDY,sBAAA,GAAyB,SAAA;EACnC,KAAA;IACE,SAAA,EAAW,KAAA;EAAA;AAAA;;;;iBAOC,mBAAA,CAAA,GAAuB,sBAAA;AAAA;EAAA,UAc3B,QAAA;IACR,SAAA;EAAA;AAAA;AFvBJ;;;AAAA,KGEY,kBAAA,GAAqB,KAAA,EAC9B,sBAAA,EAAwB,0BAAA,EAA4B,wBAAA;;AHmBvD;;iBGbgB,eAAA,CAAA,GAAmB,kBAAA;;;;UCLlB,oBAAA;EJJqB;;;;;EIUpC,SAAA;EJRiB;;AAoBnB;;;EILE,UAAA;EJKwC;AAO1C;;;;EILE,SAAA;;AHxBF;;;;EG+BE,WAAA;EH1Bc;;;;;EGiCd,YAAA;EFvCU;;;;;EE8CV,UAAA;AAAA;;;;iBAMc,mBAAA,CAAoB,OAAA,GAAS,oBAAA,GAA4B,sBAAA;;;;KAS7D,sBAAA,GAAyB,SAAA"}
|
|
@@ -4,7 +4,6 @@ import { Decoration, DecorationSet } from "@prosekit/pm/view";
|
|
|
4
4
|
import { Fragment, Slice } from "@prosekit/pm/model";
|
|
5
5
|
import { getId, once } from "@ocavue/utils";
|
|
6
6
|
import { HTMLElement, customElements } from "server-dom-shim";
|
|
7
|
-
//#region src/page/page-break-commands.ts
|
|
8
7
|
const insertPageBreakCommand = (state, dispatch) => {
|
|
9
8
|
if (!dispatch) return true;
|
|
10
9
|
const { schema, tr } = state;
|
|
@@ -27,16 +26,12 @@ function insertPageBreak() {
|
|
|
27
26
|
function definePageBreakCommands() {
|
|
28
27
|
return defineCommands({ insertPageBreak });
|
|
29
28
|
}
|
|
30
|
-
//#endregion
|
|
31
|
-
//#region src/page/page-break-keymap.ts
|
|
32
29
|
/**
|
|
33
30
|
* @internal
|
|
34
31
|
*/
|
|
35
32
|
function definePageBreakKeymap() {
|
|
36
33
|
return defineKeymap({ "Mod-Enter": insertPageBreak() });
|
|
37
34
|
}
|
|
38
|
-
//#endregion
|
|
39
|
-
//#region src/page/page-break-spec.ts
|
|
40
35
|
/**
|
|
41
36
|
* @internal
|
|
42
37
|
*/
|
|
@@ -56,16 +51,12 @@ function definePageBreakSpec() {
|
|
|
56
51
|
pageBreak: true
|
|
57
52
|
});
|
|
58
53
|
}
|
|
59
|
-
//#endregion
|
|
60
|
-
//#region src/page/page-break.ts
|
|
61
54
|
/**
|
|
62
55
|
* @public
|
|
63
56
|
*/
|
|
64
57
|
function definePageBreak() {
|
|
65
58
|
return union(definePageBreakSpec(), definePageBreakCommands(), definePageBreakKeymap());
|
|
66
59
|
}
|
|
67
|
-
//#endregion
|
|
68
|
-
//#region src/page/page-element.ts
|
|
69
60
|
/**
|
|
70
61
|
* @internal
|
|
71
62
|
*/
|
|
@@ -73,10 +64,10 @@ const PAGE_CHUNK_TAG_NAME = "pm-page-chunk";
|
|
|
73
64
|
/**
|
|
74
65
|
* @internal
|
|
75
66
|
*/
|
|
76
|
-
|
|
67
|
+
function registerPageChunkElement() {
|
|
77
68
|
if (typeof window === "undefined" || customElements.get("pm-page-chunk")) return;
|
|
78
69
|
customElements.define(PAGE_CHUNK_TAG_NAME, PageChunkElement);
|
|
79
|
-
}
|
|
70
|
+
}
|
|
80
71
|
var PageChunkElement = class extends HTMLElement {
|
|
81
72
|
static {
|
|
82
73
|
this.observedAttributes = [
|
|
@@ -242,8 +233,6 @@ function findAllChunks(element, group) {
|
|
|
242
233
|
const elements = element.closest(".ProseMirror")?.querySelectorAll(`${PAGE_CHUNK_TAG_NAME}[data-group="${group}"]`);
|
|
243
234
|
return Array.from(elements || []);
|
|
244
235
|
}
|
|
245
|
-
//#endregion
|
|
246
|
-
//#region src/page/page-rendering.ts
|
|
247
236
|
/**
|
|
248
237
|
* @public
|
|
249
238
|
*/
|
|
@@ -318,7 +307,6 @@ function createPageRenderingPlugin(options) {
|
|
|
318
307
|
}
|
|
319
308
|
});
|
|
320
309
|
}
|
|
321
|
-
//#endregion
|
|
322
310
|
export { definePageBreak, definePageBreakCommands, definePageBreakKeymap, definePageBreakSpec, definePageRendering, insertPageBreak };
|
|
323
311
|
|
|
324
|
-
//# sourceMappingURL=
|
|
312
|
+
//# sourceMappingURL=page.js.map
|
package/dist/page.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.js","names":["#parseDataAttributes","#isLeader","#isHeadPending","#render","#contentBoxHeight","#paddingTop","#paddingBottom","#requestUpdate","#group","#forceNextBreak","#pageHeight","#parseFloatAttribute","#pageMarginTop","#pageMarginBottom","#size","#paddingTopPending","#paddingBottomPending","#isHead","#isTail","#isTailPending","#updateRequested","#updateAll"],"sources":["../src/page/page-break-commands.ts","../src/page/page-break-keymap.ts","../src/page/page-break-spec.ts","../src/page/page-break.ts","../src/page/page-element.ts","../src/page/page-rendering.ts"],"sourcesContent":["import { defineCommands, getNodeType, type Extension } from '@prosekit/core'\nimport { Fragment, Slice } from '@prosekit/pm/model'\nimport type { Command } from '@prosekit/pm/state'\n\n/**\n * @internal\n */\nexport type PageBreakCommandsExtension = Extension<{\n Commands: {\n insertPageBreak: []\n }\n}>\n\nconst insertPageBreakCommand: Command = (state, dispatch): boolean => {\n if (!dispatch) return true\n\n const { schema, tr } = state\n const type = getNodeType(schema, 'pageBreak')\n const node = type.createChecked()\n const pos = tr.selection.anchor\n const slice = new Slice(Fragment.from(node), 0, 0)\n tr.replaceRange(pos, pos, slice).scrollIntoView()\n dispatch(tr)\n return true\n}\n\n/**\n * @internal\n */\nexport function insertPageBreak(): Command {\n return insertPageBreakCommand\n}\n\n/**\n * @internal\n */\nexport function definePageBreakCommands(): PageBreakCommandsExtension {\n return defineCommands({\n insertPageBreak: insertPageBreak,\n })\n}\n","import { defineKeymap, type PlainExtension } from '@prosekit/core'\n\nimport { insertPageBreak } from './page-break-commands.ts'\n\n/**\n * @internal\n */\nexport type PageBreakKeymapExtension = PlainExtension\n\n/**\n * @internal\n */\nexport function definePageBreakKeymap(): PageBreakKeymapExtension {\n return defineKeymap({\n 'Mod-Enter': insertPageBreak(),\n })\n}\n","import { defineNodeSpec, type Extension } from '@prosekit/core'\nimport type { Attrs } from '@prosekit/pm/model'\n\n/**\n * @internal\n */\nexport type PageBreakSpecExtension = Extension<{\n Nodes: {\n pageBreak: Attrs\n }\n}>\n\n/**\n * @internal\n */\nexport function definePageBreakSpec(): PageBreakSpecExtension {\n return defineNodeSpec({\n name: 'pageBreak',\n group: 'block',\n selectable: true,\n parseDOM: [{ tag: 'div.prosekit-page-break' }],\n toDOM() {\n return ['div', { class: 'prosekit-horizontal-rule prosekit-page-break' }, ['hr']]\n },\n pageBreak: true,\n })\n}\n\ndeclare module '@prosekit/pm/model' {\n interface NodeSpec {\n pageBreak?: boolean | undefined\n }\n}\n","import { union, type Union } from '@prosekit/core'\n\nimport { definePageBreakCommands, type PageBreakCommandsExtension } from './page-break-commands.ts'\nimport { definePageBreakKeymap, type PageBreakKeymapExtension } from './page-break-keymap.ts'\nimport { definePageBreakSpec, type PageBreakSpecExtension } from './page-break-spec.ts'\n\n/**\n * @internal\n */\nexport type PageBreakExtension = Union<\n [PageBreakSpecExtension, PageBreakCommandsExtension, PageBreakKeymapExtension]\n>\n\n/**\n * @public\n */\nexport function definePageBreak(): PageBreakExtension {\n return union(\n definePageBreakSpec(),\n definePageBreakCommands(),\n definePageBreakKeymap(),\n )\n}\n","import { once } from '@ocavue/utils'\nimport { customElements, HTMLElement } from 'server-dom-shim'\n\n/**\n * @internal\n */\nexport const PAGE_CHUNK_TAG_NAME = 'pm-page-chunk'\n\n/**\n * @internal\n */\nexport function registerPageChunkElement(): void {\n if (typeof window === 'undefined' || customElements.get(PAGE_CHUNK_TAG_NAME)) return\n customElements.define(PAGE_CHUNK_TAG_NAME, PageChunkElement)\n}\n\nclass PageChunkElement extends HTMLElement {\n static observedAttributes = [\n 'data-group',\n 'data-break',\n 'data-h',\n 'data-mt',\n 'data-mb',\n\n // Only the first chunk of the whole document has this attribute.\n 'data-size',\n ]\n\n // Data attributes set by external code\n #group: string = ''\n #forceNextBreak: boolean = false\n #pageHeight: number = 0\n #pageMarginTop: number = 0\n #pageMarginBottom: number = 0\n #size: number | undefined = undefined\n\n // Internal states\n #updateRequested: boolean = false\n #contentBoxHeight: number = 0\n\n // Rendering states\n #isHead: boolean = false\n #isTail: boolean = false\n #paddingTop: number = 0\n #paddingBottom: number = 0\n\n // Pending rendering states\n #isHeadPending: boolean = false\n #isTailPending: boolean = false\n #paddingTopPending: number = 0\n #paddingBottomPending: number = 0\n\n connectedCallback() {\n this.#parseDataAttributes()\n\n if (this.#isLeader()) {\n this.#isHeadPending = true\n }\n\n this.#render()\n\n // Get the initial content box height when the resize observer is not started yet. Notice that\n // `this.clientHeight` is an integer while the content box height can be a float, so this is not\n // accurate but should be good enough for the first render.\n this.#contentBoxHeight = this.clientHeight - this.#paddingTop - this.#paddingBottom\n\n observeElement(this)\n\n this.#requestUpdate()\n }\n\n disconnectedCallback() {\n unobserveElement(this)\n }\n\n attributeChangedCallback(_: string, oldValue: string | null, newValue: string | null) {\n if (oldValue === newValue) return\n this.#parseDataAttributes()\n this.#requestUpdate()\n }\n\n #parseDataAttributes() {\n this.#group = this.getAttribute('data-group') || ''\n this.#forceNextBreak = this.hasAttribute('data-break')\n this.#pageHeight = this.#parseFloatAttribute('data-h')\n this.#pageMarginTop = this.#parseFloatAttribute('data-mt')\n this.#pageMarginBottom = this.#parseFloatAttribute('data-mb')\n\n const sizeAttr = this.getAttribute('data-size')\n this.#size = sizeAttr ? Number.parseInt(sizeAttr, 10) : undefined\n }\n\n #parseFloatAttribute(name: string): number {\n const value = this.getAttribute(name)\n return value != null ? Number.parseFloat(value) : 0\n }\n\n #isLeader() {\n return this.#size != null\n }\n\n #render() {\n if (this.#paddingTop !== this.#paddingTopPending || this.#paddingBottom !== this.#paddingBottomPending) {\n Object.assign(this.style, {\n paddingTop: `${this.#paddingTop = this.#paddingTopPending}px`,\n paddingBottom: `${this.#paddingBottom = this.#paddingBottomPending}px`,\n })\n }\n if (this.#isHead !== this.#isHeadPending) {\n this.toggleAttribute('data-page-head', this.#isHead = this.#isHeadPending)\n }\n if (this.#isTail !== this.#isTailPending) {\n this.toggleAttribute('data-page-tail', this.#isTail = this.#isTailPending)\n }\n }\n\n setHeight(height: number) {\n // Avoid potential float number precision issues\n if (Math.abs(this.#contentBoxHeight - height) < 0.1) {\n return\n }\n this.#contentBoxHeight = height\n this.#requestUpdate()\n }\n\n /**\n * Schedules a batched page layout recalculation.\n *\n * Any chunk can call this method, but the actual layout work (#updateAll)\n * always runs on the leader chunk, because it needs to iterate over every\n * chunk in order to compute page breaks.\n *\n * Two nested microtasks are used to batch updates:\n *\n * Microtask 1 – Delegation: non-leader chunks forward the request to the\n * leader chunk, so multiple chunks changing in the same tick only trigger\n * one layout pass.\n *\n * Microtask 2 – Execution: the leader chunk defers #updateAll to a second\n * microtask so that any other attribute / resize changes that were queued\n * in the same tick (and forwarded during microtask 1) are already reflected\n * before the layout is recalculated.\n *\n * The #updateRequested flag acts as a deduplication guard so that rapid\n * successive calls (e.g. multiple attributes changing at once) result in at\n * most one scheduled pass per chunk.\n */\n #requestUpdate() {\n if (this.#updateRequested) {\n return\n }\n\n this.#updateRequested = true\n queueMicrotask(() => {\n if (!this.#isLeader()) {\n this.#updateRequested = false\n const leader = findLeaderChunk(this, this.#group)\n if (!leader) return\n leader.#requestUpdate()\n return\n }\n queueMicrotask(() => {\n this.#updateRequested = false\n this.#updateAll()\n })\n })\n }\n\n #updateAll() {\n if (!this.isConnected) {\n return\n }\n\n const elements = findAllChunks(this, this.#group)\n const count = elements.length\n if (count === 0) return\n\n const pageHeight = this.#pageHeight\n const pageMarginTop = this.#pageMarginTop\n const maxContentHeight = pageHeight - pageMarginTop - this.#pageMarginBottom\n\n let currentContentHeight = 0\n let forceNextBreak = false\n\n for (let i = 0; i < count; i++) {\n const element = elements[i]\n const h = element.#contentBoxHeight\n const isHead = forceNextBreak || i === 0 || (currentContentHeight + h > maxContentHeight)\n\n forceNextBreak = element.#forceNextBreak\n\n if (isHead && i > 0) {\n const prev = elements[i - 1]\n prev.#paddingBottomPending = Math.max(0, pageHeight - pageMarginTop - currentContentHeight)\n prev.#isTailPending = true\n currentContentHeight = h\n } else {\n currentContentHeight += h\n }\n\n element.#paddingTopPending = isHead ? pageMarginTop : 0\n element.#paddingBottomPending = 0\n element.#isTailPending = false\n element.#isHeadPending = isHead\n }\n\n const last = elements[count - 1]\n last.#paddingBottomPending = Math.max(0, pageHeight - pageMarginTop - currentContentHeight)\n last.#isTailPending = true\n\n for (const element of elements) {\n element.#render()\n }\n }\n}\n\nfunction handleResize(entries: ResizeObserverEntry[]) {\n for (const entry of entries) {\n const contentBoxHeight = entry.contentBoxSize?.[0]?.blockSize ?? entry.contentRect.height\n const element = entry.target as PageChunkElement\n element.setHeight(contentBoxHeight)\n }\n}\n\nconst getResizeObserver = /* @__PURE__ */ once(() => {\n return new ResizeObserver(handleResize)\n})\n\nfunction observeElement(element: PageChunkElement) {\n getResizeObserver().observe(element)\n}\n\nfunction unobserveElement(element: PageChunkElement) {\n getResizeObserver().unobserve(element)\n}\n\nfunction findLeaderChunk(element: HTMLElement, group: string): PageChunkElement | null | undefined {\n const root = element.closest('.ProseMirror')\n return root?.querySelector<PageChunkElement>(`${PAGE_CHUNK_TAG_NAME}[data-group=\"${group}\"][data-size]`)\n}\n\nfunction findAllChunks(element: HTMLElement, group: string): PageChunkElement[] {\n const root = element.closest('.ProseMirror')\n const elements = root?.querySelectorAll<PageChunkElement>(`${PAGE_CHUNK_TAG_NAME}[data-group=\"${group}\"]`)\n return Array.from(elements || [])\n}\n","import { getId } from '@ocavue/utils'\nimport { definePlugin, type Extension } from '@prosekit/core'\nimport type { Node } from '@prosekit/pm/model'\nimport { Plugin, PluginKey } from '@prosekit/pm/state'\nimport { Decoration, DecorationSet } from '@prosekit/pm/view'\n\nimport { PAGE_CHUNK_TAG_NAME, registerPageChunkElement } from './page-element.ts'\n\n/**\n * @public\n */\nexport interface PageRenderingOptions {\n /**\n * The width of the page in px.\n *\n * @default 794 (Portrait A4 paper size in 96 DPI)\n */\n pageWidth?: number\n\n /**\n * The height of the page in px.\n *\n * @default 1123 (Portrait A4 paper size in 96 DPI)\n */\n pageHeight?: number\n\n /**\n * The top margin of the page in px.\n *\n * @default 70\n */\n marginTop?: number\n\n /**\n * The right margin of the page in px.\n *\n * @default 70\n */\n marginRight?: number\n\n /**\n * The bottom margin of the page in px.\n *\n * @default 70\n */\n marginBottom?: number\n\n /**\n * The left margin of the page in px.\n *\n * @default 70\n */\n marginLeft?: number\n}\n\n/**\n * @public\n */\nexport function definePageRendering(options: PageRenderingOptions = {}): PageRenderingExtension {\n return definePlugin(\n createPageRenderingPlugin(options),\n )\n}\n\n/**\n * @internal\n */\nexport type PageRenderingExtension = Extension\n\nfunction createPageRenderingPlugin(options: PageRenderingOptions): Plugin {\n const {\n pageWidth = 794,\n pageHeight = 1123,\n marginTop = 70,\n marginRight = 70,\n marginBottom = 70,\n marginLeft = 70,\n } = options\n\n type PluginState = [group: string, decoration: DecorationSet]\n\n const key = new PluginKey<PluginState>('prosekit-page-render')\n\n function createDecorationSet(doc: Node, group: string): DecorationSet {\n const decorations: Decoration[] = []\n const totalCount = doc.childCount\n\n doc.forEach((node, pos, index) => {\n const isPageBreak: boolean | undefined = node.type.spec.pageBreak\n\n decorations.push(Decoration.node(pos, pos + node.nodeSize, {\n 'nodeName': PAGE_CHUNK_TAG_NAME,\n 'data-group': group,\n 'data-break': isPageBreak ? 'true' : undefined,\n 'data-h': String(pageHeight),\n 'data-mt': String(marginTop),\n 'data-mb': String(marginBottom),\n 'data-size': index === 0 ? String(totalCount) : undefined,\n }))\n })\n\n return DecorationSet.create(doc, decorations)\n }\n\n return new Plugin<PluginState>({\n key,\n view: () => {\n registerPageChunkElement()\n return {}\n },\n state: {\n init: (_config, state): PluginState => {\n const group = `page-group-${getId()}`\n const decoration = createDecorationSet(state.doc, group)\n return [group, decoration]\n },\n apply: (tr, value, oldState, newState): PluginState => {\n if (!tr.docChanged) return value\n\n const [group, decoration] = value\n\n let needRecreate = oldState.doc.childCount !== newState.doc.childCount\n\n if (!needRecreate) {\n const count = oldState.doc.childCount\n for (let i = 0; i < count; i++) {\n const oldNode = oldState.doc.child(i)\n const newNode = newState.doc.child(i)\n if (oldNode.type !== newNode.type) {\n needRecreate = true\n break\n }\n }\n }\n\n if (!needRecreate) {\n const mapped = decoration.map(tr.mapping, tr.doc, {\n onRemove: () => {\n needRecreate = true\n },\n })\n if (!needRecreate) {\n return [group, mapped]\n }\n }\n\n return [group, createDecorationSet(newState.doc, group)]\n },\n },\n props: {\n decorations: (state) => {\n return key.getState(state)?.[1]\n },\n attributes: {\n style: [\n `--page-margin-right:${marginRight}px;`,\n `--page-margin-left:${marginLeft}px;`,\n `--page-width:${pageWidth}px;`,\n `--page-height:${pageHeight}px;`,\n ].join(''),\n },\n },\n })\n}\n"],"mappings":"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"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { Command } from "@prosekit/pm/state";
|
|
2
2
|
import { Extension, PlainExtension, Union } from "@prosekit/core";
|
|
3
3
|
import { Attrs } from "@prosekit/pm/model";
|
|
4
|
-
|
|
5
|
-
//#region src/paragraph/paragraph-commands.d.ts
|
|
6
4
|
/**
|
|
7
5
|
* @internal
|
|
8
6
|
*/
|
|
@@ -15,14 +13,10 @@ type ParagraphCommandsExtension = Extension<{
|
|
|
15
13
|
* @internal
|
|
16
14
|
*/
|
|
17
15
|
declare function defineParagraphCommands(): ParagraphCommandsExtension;
|
|
18
|
-
//#endregion
|
|
19
|
-
//#region src/paragraph/paragraph-keymap.d.ts
|
|
20
16
|
/**
|
|
21
17
|
* @internal
|
|
22
18
|
*/
|
|
23
19
|
declare function defineParagraphKeymap(): PlainExtension;
|
|
24
|
-
//#endregion
|
|
25
|
-
//#region src/paragraph/paragraph-spec.d.ts
|
|
26
20
|
/**
|
|
27
21
|
* @internal
|
|
28
22
|
*/
|
|
@@ -37,8 +31,6 @@ type ParagraphSpecExtension = Extension<{
|
|
|
37
31
|
* Defines a paragraph node spec.
|
|
38
32
|
*/
|
|
39
33
|
declare function defineParagraphSpec(): ParagraphSpecExtension;
|
|
40
|
-
//#endregion
|
|
41
|
-
//#region src/paragraph/paragraph.d.ts
|
|
42
34
|
/**
|
|
43
35
|
* @internal
|
|
44
36
|
*/
|
|
@@ -52,6 +44,5 @@ type ParagraphExtension = Union<[ParagraphSpecExtension, ParagraphCommandsExtens
|
|
|
52
44
|
* default block node for most cases.
|
|
53
45
|
*/
|
|
54
46
|
declare function defineParagraph(): ParagraphExtension;
|
|
55
|
-
//#endregion
|
|
56
47
|
export { type ParagraphCommandsExtension, type ParagraphExtension, type ParagraphSpecExtension, defineParagraph, defineParagraphCommands, defineParagraphKeymap, defineParagraphSpec };
|
|
57
|
-
//# sourceMappingURL=
|
|
48
|
+
//# sourceMappingURL=paragraph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paragraph.d.ts","names":[],"sources":["../src/paragraph/paragraph-commands.ts","../src/paragraph/paragraph-keymap.ts","../src/paragraph/paragraph-spec.ts","../src/paragraph/paragraph.ts"],"mappings":";;;;;AAMA;KAAY,0BAAA,GAA6B,SAAA;EACvC,QAAA;IACE,YAAA;EAAA;AAAA;;;;iBAcY,uBAAA,CAAA,GAA2B,0BAAA;;;;iBCf3B,qBAAA,CAAA,GAAyB,cAAA;;;ADDzC;KEAY,sBAAA,GAAyB,SAAA;EACnC,KAAA;IACE,SAAA,EAAW,KAAA;EAAA;AAAA;;;;AFcf;;iBELgB,mBAAA,CAAA,GAAuB,sBAAA;;AFXvC;;KGIY,kBAAA,GAAqB,KAAA,EAAO,sBAAA,EAAwB,0BAAA;;;;;;;AHYhE;;iBGFgB,eAAA,CAAA,GAAmB,kBAAA"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { defineCommands, defineKeymap, defineNodeSpec, setBlockType, union, withPriority } from "@prosekit/core";
|
|
2
|
-
//#region src/paragraph/paragraph-commands.ts
|
|
3
2
|
/**
|
|
4
3
|
* @internal
|
|
5
4
|
*/
|
|
@@ -12,16 +11,12 @@ function setParagraph() {
|
|
|
12
11
|
function defineParagraphCommands() {
|
|
13
12
|
return defineCommands({ setParagraph });
|
|
14
13
|
}
|
|
15
|
-
//#endregion
|
|
16
|
-
//#region src/paragraph/paragraph-keymap.ts
|
|
17
14
|
/**
|
|
18
15
|
* @internal
|
|
19
16
|
*/
|
|
20
17
|
function defineParagraphKeymap() {
|
|
21
18
|
return defineKeymap({ "Mod-Alt-0": setParagraph() });
|
|
22
19
|
}
|
|
23
|
-
//#endregion
|
|
24
|
-
//#region src/paragraph/paragraph-spec.ts
|
|
25
20
|
/**
|
|
26
21
|
* @internal
|
|
27
22
|
*
|
|
@@ -38,8 +33,6 @@ function defineParagraphSpec() {
|
|
|
38
33
|
}
|
|
39
34
|
});
|
|
40
35
|
}
|
|
41
|
-
//#endregion
|
|
42
|
-
//#region src/paragraph/paragraph.ts
|
|
43
36
|
/**
|
|
44
37
|
* @public
|
|
45
38
|
*
|
|
@@ -51,7 +44,6 @@ function defineParagraphSpec() {
|
|
|
51
44
|
function defineParagraph() {
|
|
52
45
|
return union(withPriority(defineParagraphSpec(), 4), defineParagraphCommands(), defineParagraphKeymap());
|
|
53
46
|
}
|
|
54
|
-
//#endregion
|
|
55
47
|
export { defineParagraph, defineParagraphCommands, defineParagraphKeymap, defineParagraphSpec };
|
|
56
48
|
|
|
57
|
-
//# sourceMappingURL=
|
|
49
|
+
//# sourceMappingURL=paragraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paragraph.js","names":[],"sources":["../src/paragraph/paragraph-commands.ts","../src/paragraph/paragraph-keymap.ts","../src/paragraph/paragraph-spec.ts","../src/paragraph/paragraph.ts"],"sourcesContent":["import { defineCommands, setBlockType, type Extension } from '@prosekit/core'\nimport type { Command } from '@prosekit/pm/state'\n\n/**\n * @internal\n */\nexport type ParagraphCommandsExtension = Extension<{\n Commands: {\n setParagraph: []\n }\n}>\n\n/**\n * @internal\n */\nexport function setParagraph(): Command {\n return setBlockType({ type: 'paragraph' })\n}\n\n/**\n * @internal\n */\nexport function defineParagraphCommands(): ParagraphCommandsExtension {\n return defineCommands({ setParagraph })\n}\n","import { defineKeymap, type PlainExtension } from '@prosekit/core'\n\nimport { setParagraph } from './paragraph-commands.ts'\n\n/**\n * @internal\n */\nexport function defineParagraphKeymap(): PlainExtension {\n return defineKeymap({\n 'Mod-Alt-0': setParagraph(),\n })\n}\n","import { defineNodeSpec, type Extension } from '@prosekit/core'\nimport type { Attrs } from '@prosekit/pm/model'\n\n/**\n * @internal\n */\nexport type ParagraphSpecExtension = Extension<{\n Nodes: {\n paragraph: Attrs\n }\n}>\n\n/**\n * @internal\n *\n * Defines a paragraph node spec.\n */\nexport function defineParagraphSpec(): ParagraphSpecExtension {\n return defineNodeSpec({\n name: 'paragraph',\n content: 'inline*',\n group: 'block',\n parseDOM: [{ tag: 'p' }],\n toDOM() {\n return ['p', 0]\n },\n })\n}\n","import type { Priority } from '@prosekit/core'\nimport { union, withPriority, type Union } from '@prosekit/core'\n\nimport { defineParagraphCommands, type ParagraphCommandsExtension } from './paragraph-commands.ts'\nimport { defineParagraphKeymap } from './paragraph-keymap.ts'\nimport { defineParagraphSpec, type ParagraphSpecExtension } from './paragraph-spec.ts'\n\n/**\n * @internal\n */\nexport type ParagraphExtension = Union<[ParagraphSpecExtension, ParagraphCommandsExtension]>\n\n/**\n * @public\n *\n * Defines a paragraph node.\n *\n * The paragraph node spec has the highest priority, because it should be the\n * default block node for most cases.\n */\nexport function defineParagraph(): ParagraphExtension {\n return union(\n withPriority(defineParagraphSpec(), 4 satisfies typeof Priority.highest),\n defineParagraphCommands(),\n defineParagraphKeymap(),\n )\n}\n"],"mappings":";;;;AAeA,SAAgB,eAAwB;AACtC,QAAO,aAAa,EAAE,MAAM,aAAa,CAAC;;;;;AAM5C,SAAgB,0BAAsD;AACpE,QAAO,eAAe,EAAE,cAAc,CAAC;;;;;AChBzC,SAAgB,wBAAwC;AACtD,QAAO,aAAa,EAClB,aAAa,cAAc,EAC5B,CAAC;;;;;;;ACOJ,SAAgB,sBAA8C;AAC5D,QAAO,eAAe;EACpB,MAAM;EACN,SAAS;EACT,OAAO;EACP,UAAU,CAAC,EAAE,KAAK,KAAK,CAAC;EACxB,QAAQ;AACN,UAAO,CAAC,KAAK,EAAE;;EAElB,CAAC;;;;;;;;;;ACNJ,SAAgB,kBAAsC;AACpD,QAAO,MACL,aAAa,qBAAqB,EAAE,EAAoC,EACxE,yBAAyB,EACzB,uBAAuB,CACxB"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { PlainExtension } from "@prosekit/core";
|
|
2
2
|
import { EditorView } from "@prosekit/pm/view";
|
|
3
3
|
import { Attrs, MarkType, ProseMirrorNode, Slice } from "@prosekit/pm/model";
|
|
4
|
-
|
|
5
|
-
//#region src/paste-rule/mark-paste-rule.d.ts
|
|
6
4
|
/**
|
|
7
5
|
* The options for {@link defineMarkPasteRule}.
|
|
8
6
|
*
|
|
@@ -37,8 +35,6 @@ interface MarkPasteRuleOptions {
|
|
|
37
35
|
* @public
|
|
38
36
|
*/
|
|
39
37
|
declare function defineMarkPasteRule(options: MarkPasteRuleOptions): PlainExtension;
|
|
40
|
-
//#endregion
|
|
41
|
-
//#region src/paste-rule/paste-rule.d.ts
|
|
42
38
|
/**
|
|
43
39
|
* @public
|
|
44
40
|
*
|
|
@@ -88,6 +84,5 @@ interface PasteRuleOptions {
|
|
|
88
84
|
declare function definePasteRule({
|
|
89
85
|
handler
|
|
90
86
|
}: PasteRuleOptions): PlainExtension;
|
|
91
|
-
//#endregion
|
|
92
87
|
export { type MarkPasteRuleOptions, type PasteRuleHandler, type PasteRuleHandlerOptions, type PasteRuleOptions, defineMarkPasteRule, definePasteRule };
|
|
93
|
-
//# sourceMappingURL=
|
|
88
|
+
//# sourceMappingURL=paste-rule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paste-rule.d.ts","names":[],"sources":["../src/paste-rule/mark-paste-rule.ts","../src/paste-rule/paste-rule.ts"],"mappings":";;;;;AAYA;;;UAAiB,oBAAA;EAUA;;;;EALf,KAAA,EAAO,MAAA;EAmB4B;;;EAdnC,IAAA,WAAe,QAAA;EAAA;;;;;;EAQf,QAAA,IAAY,KAAA,EAAO,eAAA,KAAoB,KAAA;EAMzB;;;AAQhB;EARE,UAAA,IAAc,IAAA,EAAM,eAAA;AAAA;;;;;;iBAQN,mBAAA,CAAoB,OAAA,EAAS,oBAAA,GAAuB,cAAA;;AAhCpE;;;;UCDiB,uBAAA;EDmBI;;;ECfnB,KAAA,EAAO,KAAA;EDqB4B;;;EChBnC,IAAA,EAAM,UAAA;EDES;;;;ECIf,KAAA;AAAA;;;;;ADkBF;;KCTY,gBAAA,IAAoB,OAAA,EAAS,uBAAA,KAA4B,KAAA;;;;;;UAOpD,gBAAA;;AA/BjB;;EAmCE,OAAA,EAAS,gBAAA;AAAA;;;;;;;;AAXX;iBAsBgB,eAAA,CAAA;EAAkB;AAAA,GAAW,gBAAA,GAAmB,cAAA"}
|
package/dist/paste-rule.js
CHANGED
|
@@ -1,158 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
import { Fragment, Slice } from "@prosekit/pm/model";
|
|
4
|
-
//#region src/paste-rule/paste-rule-plugin.ts
|
|
5
|
-
/**
|
|
6
|
-
* @internal
|
|
7
|
-
*/
|
|
8
|
-
const pasteRuleFacet = defineFacet({
|
|
9
|
-
reduce: () => {
|
|
10
|
-
let handlers = [];
|
|
11
|
-
const transformPasted = (slice, view, plain) => {
|
|
12
|
-
for (const handler of handlers) slice = handler({
|
|
13
|
-
slice,
|
|
14
|
-
view,
|
|
15
|
-
plain
|
|
16
|
-
});
|
|
17
|
-
return slice;
|
|
18
|
-
};
|
|
19
|
-
const plugin = new ProseMirrorPlugin({
|
|
20
|
-
key: new PluginKey("prosekit-paste-rule"),
|
|
21
|
-
props: { transformPasted }
|
|
22
|
-
});
|
|
23
|
-
return (inputs) => {
|
|
24
|
-
handlers = [...inputs].reverse();
|
|
25
|
-
return plugin;
|
|
26
|
-
};
|
|
27
|
-
},
|
|
28
|
-
singleton: true,
|
|
29
|
-
parent: pluginFacet
|
|
30
|
-
});
|
|
31
|
-
/**
|
|
32
|
-
* @internal
|
|
33
|
-
*/
|
|
34
|
-
function definePasteRulePlugin(payload) {
|
|
35
|
-
return defineFacetPayload(pasteRuleFacet, [payload]);
|
|
36
|
-
}
|
|
37
|
-
//#endregion
|
|
38
|
-
//#region src/paste-rule/paste-rule.ts
|
|
39
|
-
/**
|
|
40
|
-
* Defines a paste rule. This rule allows you to modify pasted or dragged
|
|
41
|
-
* content before it is inserted into the document.
|
|
42
|
-
*
|
|
43
|
-
* @param options
|
|
44
|
-
*
|
|
45
|
-
* @public
|
|
46
|
-
*/
|
|
47
|
-
function definePasteRule({ handler }) {
|
|
48
|
-
return definePasteRulePlugin(handler);
|
|
49
|
-
}
|
|
50
|
-
//#endregion
|
|
51
|
-
//#region src/paste-rule/split-text-by-regex.ts
|
|
52
|
-
/**
|
|
53
|
-
* Splits text into chunks based on regex matches, preserving both matched and unmatched segments.
|
|
54
|
-
* Returns an array of tuples where each tuple contains a text segment and either the match data
|
|
55
|
-
* (for matched segments) or undefined (for unmatched segments).
|
|
56
|
-
*/
|
|
57
|
-
function splitTextByRegex(text, regex) {
|
|
58
|
-
regex.lastIndex = 0;
|
|
59
|
-
const chunks = [];
|
|
60
|
-
let lastIndex = 0;
|
|
61
|
-
let match;
|
|
62
|
-
let matched = false;
|
|
63
|
-
while (match = regex.exec(text)) {
|
|
64
|
-
const start = match.index;
|
|
65
|
-
const end = regex.lastIndex;
|
|
66
|
-
if (start > lastIndex) chunks.push([text.slice(lastIndex, start), void 0]);
|
|
67
|
-
chunks.push([text.slice(start, end), match]);
|
|
68
|
-
matched = true;
|
|
69
|
-
if (lastIndex === end) return;
|
|
70
|
-
lastIndex = end;
|
|
71
|
-
}
|
|
72
|
-
if (matched && lastIndex < text.length) chunks.push([text.slice(lastIndex), void 0]);
|
|
73
|
-
regex.lastIndex = 0;
|
|
74
|
-
return matched ? chunks : void 0;
|
|
75
|
-
}
|
|
76
|
-
//#endregion
|
|
77
|
-
//#region src/paste-rule/mark-paste-rule.ts
|
|
78
|
-
/**
|
|
79
|
-
* Defines a paste rule that applies marks based on regex patterns.
|
|
80
|
-
*
|
|
81
|
-
* @public
|
|
82
|
-
*/
|
|
83
|
-
function defineMarkPasteRule(options) {
|
|
84
|
-
return definePasteRule({ handler: ({ slice, view, plain }) => {
|
|
85
|
-
if (plain) return slice;
|
|
86
|
-
return replaceMarkInSlice({
|
|
87
|
-
markType: getMarkType(view.state.schema, options.type),
|
|
88
|
-
regex: options.regex,
|
|
89
|
-
getAttrs: options.getAttrs,
|
|
90
|
-
shouldSkip: options.shouldSkip
|
|
91
|
-
}, slice);
|
|
92
|
-
} });
|
|
93
|
-
}
|
|
94
|
-
function replaceMarkInSlice(options, slice) {
|
|
95
|
-
const newFragment = replaceMarkInFragment(options, slice.content);
|
|
96
|
-
if (!newFragment) return slice;
|
|
97
|
-
return new Slice(newFragment, slice.openStart, slice.openEnd);
|
|
98
|
-
}
|
|
99
|
-
function replaceMarkInFragment(options, fragment) {
|
|
100
|
-
let changed = false;
|
|
101
|
-
const children = [];
|
|
102
|
-
for (const child of fragment.content) {
|
|
103
|
-
const newChild = replaceMarkInNode(options, child);
|
|
104
|
-
if (newChild) changed = true;
|
|
105
|
-
children.push(newChild || child);
|
|
106
|
-
}
|
|
107
|
-
if (changed) return Fragment.from(children);
|
|
108
|
-
}
|
|
109
|
-
function replaceMarkInNode(options, node) {
|
|
110
|
-
if (node.type.spec.code) return;
|
|
111
|
-
if (node.type.isInline) return;
|
|
112
|
-
if (node.type.isTextblock) return replaceMarkInTextblockNode(options, node);
|
|
113
|
-
const newChildren = replaceMarkInFragment(options, node.content);
|
|
114
|
-
if (!newChildren) return;
|
|
115
|
-
return node.copy(newChildren);
|
|
116
|
-
}
|
|
117
|
-
function replaceMarkInTextblockNode(options, node) {
|
|
118
|
-
const newChildren = [];
|
|
119
|
-
let changed = false;
|
|
120
|
-
for (const inlineNode of node.content.content) {
|
|
121
|
-
const newInlineNodes = replaceMarkInInlineNode(options, inlineNode);
|
|
122
|
-
if (newInlineNodes) {
|
|
123
|
-
changed = true;
|
|
124
|
-
newChildren.push(...newInlineNodes);
|
|
125
|
-
} else newChildren.push(inlineNode);
|
|
126
|
-
}
|
|
127
|
-
if (changed) return node.copy(Fragment.from(newChildren));
|
|
128
|
-
}
|
|
129
|
-
function replaceMarkInInlineNode(options, node) {
|
|
130
|
-
const text = node.text;
|
|
131
|
-
if (!text) return;
|
|
132
|
-
const { markType, shouldSkip } = options;
|
|
133
|
-
if (shouldSkip) {
|
|
134
|
-
if (shouldSkip(node)) return;
|
|
135
|
-
} else {
|
|
136
|
-
if (node.marks.some((mark) => mark.type === markType)) return;
|
|
137
|
-
if (node.marks.some((mark) => mark.type.spec.code)) return;
|
|
138
|
-
}
|
|
139
|
-
const chunks = splitTextByRegex(text, options.regex);
|
|
140
|
-
if (!chunks) return;
|
|
141
|
-
const schema = node.type.schema;
|
|
142
|
-
const nodes = [];
|
|
143
|
-
for (const [text, match] of chunks) {
|
|
144
|
-
if (!text) continue;
|
|
145
|
-
if (match) {
|
|
146
|
-
const attrs = options.getAttrs?.(match) ?? null;
|
|
147
|
-
if (attrs !== false) {
|
|
148
|
-
const mark = markType.create(attrs);
|
|
149
|
-
nodes.push(schema.text(text, [...node.marks, mark]));
|
|
150
|
-
} else nodes.push(schema.text(text, node.marks));
|
|
151
|
-
} else nodes.push(schema.text(text, node.marks));
|
|
152
|
-
}
|
|
153
|
-
return nodes;
|
|
154
|
-
}
|
|
155
|
-
//#endregion
|
|
156
|
-
export { definePasteRule as n, defineMarkPasteRule as t };
|
|
157
|
-
|
|
158
|
-
//# sourceMappingURL=paste-rule.js.map
|
|
1
|
+
import { n as definePasteRule, t as defineMarkPasteRule } from "./paste-rule2.js";
|
|
2
|
+
export { defineMarkPasteRule, definePasteRule };
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { PluginKey, ProseMirrorPlugin } from "@prosekit/pm/state";
|
|
2
|
+
import { defineFacet, defineFacetPayload, getMarkType, pluginFacet } from "@prosekit/core";
|
|
3
|
+
import { Fragment, Slice } from "@prosekit/pm/model";
|
|
4
|
+
/**
|
|
5
|
+
* @internal
|
|
6
|
+
*/
|
|
7
|
+
const pasteRuleFacet = defineFacet({
|
|
8
|
+
reduce: () => {
|
|
9
|
+
let handlers = [];
|
|
10
|
+
const transformPasted = (slice, view, plain) => {
|
|
11
|
+
for (const handler of handlers) slice = handler({
|
|
12
|
+
slice,
|
|
13
|
+
view,
|
|
14
|
+
plain
|
|
15
|
+
});
|
|
16
|
+
return slice;
|
|
17
|
+
};
|
|
18
|
+
const plugin = new ProseMirrorPlugin({
|
|
19
|
+
key: new PluginKey("prosekit-paste-rule"),
|
|
20
|
+
props: { transformPasted }
|
|
21
|
+
});
|
|
22
|
+
return (inputs) => {
|
|
23
|
+
handlers = [...inputs].reverse();
|
|
24
|
+
return plugin;
|
|
25
|
+
};
|
|
26
|
+
},
|
|
27
|
+
singleton: true,
|
|
28
|
+
parent: pluginFacet
|
|
29
|
+
});
|
|
30
|
+
/**
|
|
31
|
+
* @internal
|
|
32
|
+
*/
|
|
33
|
+
function definePasteRulePlugin(payload) {
|
|
34
|
+
return defineFacetPayload(pasteRuleFacet, [payload]);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Defines a paste rule. This rule allows you to modify pasted or dragged
|
|
38
|
+
* content before it is inserted into the document.
|
|
39
|
+
*
|
|
40
|
+
* @param options
|
|
41
|
+
*
|
|
42
|
+
* @public
|
|
43
|
+
*/
|
|
44
|
+
function definePasteRule({ handler }) {
|
|
45
|
+
return definePasteRulePlugin(handler);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Splits text into chunks based on regex matches, preserving both matched and unmatched segments.
|
|
49
|
+
* Returns an array of tuples where each tuple contains a text segment and either the match data
|
|
50
|
+
* (for matched segments) or undefined (for unmatched segments).
|
|
51
|
+
*/
|
|
52
|
+
function splitTextByRegex(text, regex) {
|
|
53
|
+
regex.lastIndex = 0;
|
|
54
|
+
const chunks = [];
|
|
55
|
+
let lastIndex = 0;
|
|
56
|
+
let match;
|
|
57
|
+
let matched = false;
|
|
58
|
+
while (match = regex.exec(text)) {
|
|
59
|
+
const start = match.index;
|
|
60
|
+
const end = regex.lastIndex;
|
|
61
|
+
if (start > lastIndex) chunks.push([text.slice(lastIndex, start), void 0]);
|
|
62
|
+
chunks.push([text.slice(start, end), match]);
|
|
63
|
+
matched = true;
|
|
64
|
+
if (lastIndex === end) return;
|
|
65
|
+
lastIndex = end;
|
|
66
|
+
}
|
|
67
|
+
if (matched && lastIndex < text.length) chunks.push([text.slice(lastIndex), void 0]);
|
|
68
|
+
regex.lastIndex = 0;
|
|
69
|
+
return matched ? chunks : void 0;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Defines a paste rule that applies marks based on regex patterns.
|
|
73
|
+
*
|
|
74
|
+
* @public
|
|
75
|
+
*/
|
|
76
|
+
function defineMarkPasteRule(options) {
|
|
77
|
+
return definePasteRule({ handler: ({ slice, view, plain }) => {
|
|
78
|
+
if (plain) return slice;
|
|
79
|
+
return replaceMarkInSlice({
|
|
80
|
+
markType: getMarkType(view.state.schema, options.type),
|
|
81
|
+
regex: options.regex,
|
|
82
|
+
getAttrs: options.getAttrs,
|
|
83
|
+
shouldSkip: options.shouldSkip
|
|
84
|
+
}, slice);
|
|
85
|
+
} });
|
|
86
|
+
}
|
|
87
|
+
function replaceMarkInSlice(options, slice) {
|
|
88
|
+
const newFragment = replaceMarkInFragment(options, slice.content);
|
|
89
|
+
if (!newFragment) return slice;
|
|
90
|
+
return new Slice(newFragment, slice.openStart, slice.openEnd);
|
|
91
|
+
}
|
|
92
|
+
function replaceMarkInFragment(options, fragment) {
|
|
93
|
+
let changed = false;
|
|
94
|
+
const children = [];
|
|
95
|
+
for (const child of fragment.content) {
|
|
96
|
+
const newChild = replaceMarkInNode(options, child);
|
|
97
|
+
if (newChild) changed = true;
|
|
98
|
+
children.push(newChild || child);
|
|
99
|
+
}
|
|
100
|
+
if (changed) return Fragment.from(children);
|
|
101
|
+
}
|
|
102
|
+
function replaceMarkInNode(options, node) {
|
|
103
|
+
if (node.type.spec.code) return;
|
|
104
|
+
if (node.type.isInline) return;
|
|
105
|
+
if (node.type.isTextblock) return replaceMarkInTextblockNode(options, node);
|
|
106
|
+
const newChildren = replaceMarkInFragment(options, node.content);
|
|
107
|
+
if (!newChildren) return;
|
|
108
|
+
return node.copy(newChildren);
|
|
109
|
+
}
|
|
110
|
+
function replaceMarkInTextblockNode(options, node) {
|
|
111
|
+
const newChildren = [];
|
|
112
|
+
let changed = false;
|
|
113
|
+
for (const inlineNode of node.content.content) {
|
|
114
|
+
const newInlineNodes = replaceMarkInInlineNode(options, inlineNode);
|
|
115
|
+
if (newInlineNodes) {
|
|
116
|
+
changed = true;
|
|
117
|
+
newChildren.push(...newInlineNodes);
|
|
118
|
+
} else newChildren.push(inlineNode);
|
|
119
|
+
}
|
|
120
|
+
if (changed) return node.copy(Fragment.from(newChildren));
|
|
121
|
+
}
|
|
122
|
+
function replaceMarkInInlineNode(options, node) {
|
|
123
|
+
const text = node.text;
|
|
124
|
+
if (!text) return;
|
|
125
|
+
const { markType, shouldSkip } = options;
|
|
126
|
+
if (shouldSkip) {
|
|
127
|
+
if (shouldSkip(node)) return;
|
|
128
|
+
} else {
|
|
129
|
+
if (node.marks.some((mark) => mark.type === markType)) return;
|
|
130
|
+
if (node.marks.some((mark) => mark.type.spec.code)) return;
|
|
131
|
+
}
|
|
132
|
+
const chunks = splitTextByRegex(text, options.regex);
|
|
133
|
+
if (!chunks) return;
|
|
134
|
+
const schema = node.type.schema;
|
|
135
|
+
const nodes = [];
|
|
136
|
+
for (const [text, match] of chunks) {
|
|
137
|
+
if (!text) continue;
|
|
138
|
+
if (match) {
|
|
139
|
+
const attrs = options.getAttrs?.(match) ?? null;
|
|
140
|
+
if (attrs !== false) {
|
|
141
|
+
const mark = markType.create(attrs);
|
|
142
|
+
nodes.push(schema.text(text, [...node.marks, mark]));
|
|
143
|
+
} else nodes.push(schema.text(text, node.marks));
|
|
144
|
+
} else nodes.push(schema.text(text, node.marks));
|
|
145
|
+
}
|
|
146
|
+
return nodes;
|
|
147
|
+
}
|
|
148
|
+
export { definePasteRule as n, defineMarkPasteRule as t };
|
|
149
|
+
|
|
150
|
+
//# sourceMappingURL=paste-rule2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paste-rule2.js","names":[],"sources":["../src/paste-rule/paste-rule-plugin.ts","../src/paste-rule/paste-rule.ts","../src/paste-rule/split-text-by-regex.ts","../src/paste-rule/mark-paste-rule.ts"],"sourcesContent":["import { defineFacet, defineFacetPayload, pluginFacet, type PlainExtension, type PluginPayload } from '@prosekit/core'\nimport type { Slice } from '@prosekit/pm/model'\nimport { PluginKey, ProseMirrorPlugin } from '@prosekit/pm/state'\nimport type { EditorView } from '@prosekit/pm/view'\n\ntype PasteRulePayload = (options: { slice: Slice; view: EditorView; plain: boolean }) => Slice\n\n/**\n * @internal\n */\nconst pasteRuleFacet = defineFacet<PasteRulePayload, PluginPayload>({\n reduce: () => {\n let handlers: PasteRulePayload[] = []\n\n const transformPasted = (slice: Slice, view: EditorView, plain: boolean): Slice => {\n for (const handler of handlers) {\n slice = handler({ slice, view, plain })\n }\n return slice\n }\n\n const plugin = new ProseMirrorPlugin({\n key: new PluginKey('prosekit-paste-rule'),\n props: {\n transformPasted,\n },\n })\n\n return (inputs: PasteRulePayload[]) => {\n // Last added rule (highest priority) is applied first\n handlers = [...inputs].reverse()\n return plugin\n }\n },\n singleton: true,\n parent: pluginFacet,\n})\n\n/**\n * @internal\n */\nexport function definePasteRulePlugin(payload: PasteRulePayload): PlainExtension {\n return defineFacetPayload(pasteRuleFacet, [payload]) as PlainExtension\n}\n","import type { PlainExtension } from '@prosekit/core'\nimport type { Slice } from '@prosekit/pm/model'\nimport type { EditorView } from '@prosekit/pm/view'\n\nimport { definePasteRulePlugin } from './paste-rule-plugin.ts'\n\n/**\n * @public\n *\n * Options for {@link PasteRuleHandler}.\n */\nexport interface PasteRuleHandlerOptions {\n /**\n * The slice to be pasted.\n */\n slice: Slice\n\n /**\n * The editor view.\n */\n view: EditorView\n\n /**\n * Whether the pasted content is treated as plain text. This is true when the\n * `Shift` key is held when pasting.\n */\n plain: boolean\n}\n\n/**\n * @public\n *\n * Can be used to transform pasted or dragged-and-dropped content before it is\n * applied to the document.\n */\nexport type PasteRuleHandler = (options: PasteRuleHandlerOptions) => Slice\n\n/**\n * Options for {@link definePasteRule}.\n *\n * @public\n */\nexport interface PasteRuleOptions {\n /**\n * A function to be called when a paste rule is triggered.\n */\n handler: PasteRuleHandler\n}\n\n/**\n * Defines a paste rule. This rule allows you to modify pasted or dragged\n * content before it is inserted into the document.\n *\n * @param options\n *\n * @public\n */\nexport function definePasteRule({ handler }: PasteRuleOptions): PlainExtension {\n return definePasteRulePlugin(handler)\n}\n","/**\n * Splits text into chunks based on regex matches, preserving both matched and unmatched segments.\n * Returns an array of tuples where each tuple contains a text segment and either the match data\n * (for matched segments) or undefined (for unmatched segments).\n */\nexport function splitTextByRegex(\n text: string,\n regex: RegExp,\n): Array<[string, RegExpExecArray | undefined]> | undefined {\n regex.lastIndex = 0\n\n const chunks: Array<[string, RegExpExecArray | undefined]> = []\n let lastIndex = 0\n let match: RegExpExecArray | null\n let matched = false\n\n while ((match = regex.exec(text))) {\n const start = match.index\n const end = regex.lastIndex\n\n // Push the unmatched prefix, if any.\n if (start > lastIndex) {\n chunks.push([text.slice(lastIndex, start), undefined])\n }\n\n // Push the matched segment.\n chunks.push([text.slice(start, end), match])\n matched = true\n\n if (lastIndex === end) {\n // Safeguard against zero-width matches that would otherwise cause an infinite loop.\n return\n }\n lastIndex = end\n }\n\n if (matched && lastIndex < text.length) {\n chunks.push([text.slice(lastIndex), undefined])\n }\n\n regex.lastIndex = 0\n\n return matched ? chunks : undefined\n}\n","import { getMarkType, type PlainExtension } from '@prosekit/core'\nimport type { Attrs, MarkType, ProseMirrorNode } from '@prosekit/pm/model'\nimport { Fragment, Slice } from '@prosekit/pm/model'\n\nimport { definePasteRule } from './paste-rule.ts'\nimport { splitTextByRegex } from './split-text-by-regex.ts'\n\n/**\n * The options for {@link defineMarkPasteRule}.\n *\n * @public\n */\nexport interface MarkPasteRuleOptions {\n /**\n * The regular expression to match against. It must have a `g` flag to match\n * all instances of the mark.\n */\n regex: RegExp\n\n /**\n * The mark type to apply to the matched text.\n */\n type: string | MarkType\n\n /**\n * A function used to compute attributes to set on the mark created by this\n * rule. When it returns `false`, the rule won't match. When it returns `null`\n * or `undefined`, that is interpreted as an empty/default set of attributes.\n * @default null\n */\n getAttrs?: (match: RegExpExecArray) => Attrs | null | undefined | false\n\n /**\n * Optional function to determine if a text node should be skipped.\n * Default behavior: skip code nodes and nodes that already have the target mark.\n */\n shouldSkip?: (node: ProseMirrorNode) => boolean\n}\n\n/**\n * Defines a paste rule that applies marks based on regex patterns.\n *\n * @public\n */\nexport function defineMarkPasteRule(options: MarkPasteRuleOptions): PlainExtension {\n return definePasteRule({\n handler: ({ slice, view, plain }) => {\n if (plain) {\n return slice\n }\n\n const markType = getMarkType(view.state.schema, options.type)\n\n return replaceMarkInSlice({\n markType,\n regex: options.regex,\n getAttrs: options.getAttrs,\n shouldSkip: options.shouldSkip,\n }, slice)\n },\n })\n}\n\ninterface MarkPasteRuleHandlerOptions {\n markType: MarkType\n regex: RegExp\n getAttrs?: (match: RegExpExecArray) => Attrs | null | undefined | false\n shouldSkip?: (node: ProseMirrorNode) => boolean\n}\n\nfunction replaceMarkInSlice(options: MarkPasteRuleHandlerOptions, slice: Slice): Slice {\n const newFragment = replaceMarkInFragment(options, slice.content)\n if (!newFragment) {\n return slice\n }\n return new Slice(newFragment, slice.openStart, slice.openEnd)\n}\n\nfunction replaceMarkInFragment(options: MarkPasteRuleHandlerOptions, fragment: Fragment): Fragment | undefined {\n let changed = false\n const children: ProseMirrorNode[] = []\n\n for (const child of fragment.content) {\n const newChild = replaceMarkInNode(options, child)\n if (newChild) {\n changed = true\n }\n children.push(newChild || child)\n }\n\n if (changed) {\n return Fragment.from(children)\n }\n\n return\n}\n\nfunction replaceMarkInNode(options: MarkPasteRuleHandlerOptions, node: ProseMirrorNode): ProseMirrorNode | undefined {\n if (node.type.spec.code) {\n return\n }\n if (node.type.isInline) {\n return\n }\n if (node.type.isTextblock) {\n return replaceMarkInTextblockNode(options, node)\n }\n\n const newChildren = replaceMarkInFragment(options, node.content)\n if (!newChildren) {\n return\n }\n return node.copy(newChildren)\n}\n\nfunction replaceMarkInTextblockNode(options: MarkPasteRuleHandlerOptions, node: ProseMirrorNode): ProseMirrorNode | undefined {\n const newChildren: ProseMirrorNode[] = []\n let changed = false\n\n for (const inlineNode of node.content.content) {\n const newInlineNodes = replaceMarkInInlineNode(options, inlineNode)\n if (newInlineNodes) {\n changed = true\n newChildren.push(...newInlineNodes)\n } else {\n newChildren.push(inlineNode)\n }\n }\n if (changed) {\n return node.copy(Fragment.from(newChildren))\n }\n return\n}\n\nfunction replaceMarkInInlineNode(options: MarkPasteRuleHandlerOptions, node: ProseMirrorNode): ProseMirrorNode[] | undefined {\n const text = node.text\n if (!text) {\n return\n }\n\n const { markType, shouldSkip } = options\n\n // Use custom skip logic if provided, otherwise use default\n if (shouldSkip) {\n if (shouldSkip(node)) {\n return\n }\n } else {\n // Default skip logic: skip if already has the target mark or has code mark\n if (node.marks.some((mark) => mark.type === markType)) {\n return\n }\n if (node.marks.some((mark) => mark.type.spec.code)) {\n return\n }\n }\n\n const chunks = splitTextByRegex(text, options.regex)\n if (!chunks) {\n return\n }\n\n const schema = node.type.schema\n const nodes: ProseMirrorNode[] = []\n\n for (const [text, match] of chunks) {\n if (!text) {\n continue\n }\n if (match) {\n const attrs = options.getAttrs?.(match) ?? null\n if (attrs !== false) {\n const mark = markType.create(attrs)\n nodes.push(schema.text(text, [...node.marks, mark]))\n } else {\n nodes.push(schema.text(text, node.marks))\n }\n } else {\n nodes.push(schema.text(text, node.marks))\n }\n }\n\n return nodes\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { EditorState } from "@prosekit/pm/state";
|
|
2
2
|
import { PlainExtension } from "@prosekit/core";
|
|
3
|
-
|
|
4
|
-
//#region src/placeholder/index.d.ts
|
|
5
3
|
interface PlaceholderOptions {
|
|
6
4
|
/**
|
|
7
5
|
* The placeholder to use. It can be a static string or a function that
|
|
@@ -29,6 +27,5 @@ interface PlaceholderOptions {
|
|
|
29
27
|
* empty.
|
|
30
28
|
*/
|
|
31
29
|
declare function definePlaceholder(options: PlaceholderOptions): PlainExtension;
|
|
32
|
-
//#endregion
|
|
33
30
|
export { PlaceholderOptions, definePlaceholder };
|
|
34
|
-
//# sourceMappingURL=
|
|
31
|
+
//# sourceMappingURL=placeholder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"placeholder.d.ts","names":[],"sources":["../src/placeholder/index.ts"],"mappings":";;UAOiB,kBAAA;EAAA;;;;EAKf,WAAA,aAAwB,KAAA,EAAO,WAAA;EAAA;;;;;;;AAuBjC;;;;;;;EAPE,QAAA,uBAA+B,KAAA,EAAO,WAAA;AAAA;;;;;iBAOxB,iBAAA,CAAkB,OAAA,EAAS,kBAAA,GAAqB,cAAA"}
|