1
- /* @flow strict */
2
-
3
1
import { insertText } from './text'
4
2
5
3
export function install ( el : HTMLElement ) : void {
@@ -17,18 +15,17 @@ export function uninstall(el: HTMLElement): void {
17
15
function onDrop ( event : DragEvent ) {
18
16
const transfer = event . dataTransfer
19
17
if ( ! transfer ) return
20
-
21
18
if ( hasFile ( transfer ) ) return
22
19
23
- const table = hasTable ( transfer )
24
- if ( ! table ) return
20
+ const textToPaste = generateText ( transfer )
21
+ if ( ! textToPaste ) return
25
22
26
23
event . stopPropagation ( )
27
24
event . preventDefault ( )
28
25
29
26
const field = event . currentTarget
30
27
if ( field instanceof HTMLTextAreaElement ) {
31
- insertText ( field , tableMarkdown ( table ) )
28
+ insertText ( field , textToPaste )
32
29
}
33
30
}
34
31
@@ -40,15 +37,15 @@ function onDragover(event: DragEvent) {
40
37
function onPaste ( event : ClipboardEvent ) {
41
38
if ( ! event . clipboardData ) return
42
39
43
- const table = hasTable ( event . clipboardData )
44
- if ( ! table ) return
40
+ const textToPaste = generateText ( event . clipboardData )
41
+ if ( ! textToPaste ) return
45
42
46
43
event . stopPropagation ( )
47
44
event . preventDefault ( )
48
45
49
46
const field = event . currentTarget
50
47
if ( field instanceof HTMLTextAreaElement ) {
51
- insertText ( field , tableMarkdown ( table ) )
48
+ insertText ( field , textToPaste )
52
49
}
53
50
}
54
51
@@ -84,18 +81,19 @@ function tableMarkdown(node: Element): string {
84
81
return `\n${ header } ${ body } \n\n`
85
82
}
86
83
87
- function parseTable ( html : string ) : HTMLElement | null {
84
+ function generateText ( transfer : DataTransfer ) : string | undefined {
85
+ if ( Array . from ( transfer . types ) . indexOf ( 'text/html' ) === - 1 ) return
86
+
87
+ const html = transfer . getData ( 'text/html' )
88
+ if ( ! / < t a b l e / i. test ( html ) ) return
89
+
88
90
const el = document . createElement ( 'div' )
89
91
el . innerHTML = html
90
- return el . querySelector ( 'table' )
91
- }
92
-
93
- function hasTable ( transfer : DataTransfer ) : HTMLElement | null {
94
- if ( Array . from ( transfer . types ) . indexOf ( 'text/html' ) === - 1 ) return null
92
+ let table = el . querySelector ( 'table' )
93
+ table = ! table || table . closest ( '[data-paste-markdown-skip]' ) ? null : table
94
+ if ( ! table ) return
95
95
96
- const html = transfer . getData ( 'text/html' )
97
- if ( ! / < t a b l e / i. test ( html ) ) return null
96
+ const formattedTable = tableMarkdown ( table )
98
97
99
- const table = parseTable ( html )
100
- return ! table || table . closest ( '[data-paste-markdown-skip]' ) ? null : table
98
+ return html . replace ( / < m e t a .* ?> / , '' ) . replace ( / < t a b l e [ . \S \s ] * < \/ t a b l e > / , `\n${ formattedTable } ` )
101
99
}
0 commit comments