1
- import { Plugin , TextSelection } from 'prosemirror-state' ;
1
+ import { Plugin , TextSelection , type Transaction } from 'prosemirror-state' ;
2
2
3
3
import type { ExtensionDeps , Parser } from '../../../core' ;
4
4
import { isNodeSelection , isTextSelection } from '../../../utils/selection' ;
@@ -14,28 +14,48 @@ export function linkPasteEnhance({markupParser: parser}: ExtensionDeps) {
14
14
paste ( view , e ) : boolean {
15
15
const { state, dispatch} = view ;
16
16
const sel = state . selection ;
17
+ let tr : Transaction | null = null ;
18
+
17
19
if (
18
20
isTextSelection ( sel ) ||
19
21
( isNodeSelection ( sel ) && sel . node . type === imageType ( state . schema ) )
20
22
) {
21
23
const { $from, $to} = sel ;
22
- if ( $from . pos !== $to . pos && $from . sameParent ( $to ) ) {
24
+ if ( $from . pos === $to . pos ) {
23
25
const url = getUrl ( e . clipboardData , parser ) ;
24
26
if ( url ) {
25
- const tr = state . tr . addMark (
27
+ const linkMarkType = linkType ( state . schema ) ;
28
+ tr = state . tr . replaceSelectionWith (
29
+ state . schema . text ( url , [
30
+ ...$from
31
+ . marks ( )
32
+ . filter ( ( mark ) => mark . type !== linkMarkType ) ,
33
+ linkMarkType . create ( { [ LinkAttr . Href ] : url } ) ,
34
+ ] ) ,
35
+ false ,
36
+ ) ;
37
+ }
38
+ } else if ( $from . sameParent ( $to ) ) {
39
+ const url = getUrl ( e . clipboardData , parser ) ;
40
+ if ( url ) {
41
+ tr = state . tr . addMark (
26
42
$from . pos ,
27
43
$to . pos ,
28
44
linkType ( state . schema ) . create ( {
29
45
[ LinkAttr . Href ] : url ,
30
46
} ) ,
31
47
) ;
32
- dispatch ( tr . setSelection ( TextSelection . create ( tr . doc , $to . pos ) ) ) ;
33
- e . preventDefault ( ) ;
34
- return true ;
48
+ tr . setSelection ( TextSelection . create ( tr . doc , $to . pos ) ) ;
35
49
}
36
50
}
37
51
}
38
52
53
+ if ( tr ) {
54
+ dispatch ( tr . scrollIntoView ( ) ) ;
55
+ e . preventDefault ( ) ;
56
+ return true ;
57
+ }
58
+
39
59
return false ;
40
60
} ,
41
61
} ,
0 commit comments