1- /* @flow strict */
2-
31import { insertText } from './text'
42
53export function install ( el : HTMLElement ) : void {
@@ -17,18 +15,17 @@ export function uninstall(el: HTMLElement): void {
1715function onDrop ( event : DragEvent ) {
1816 const transfer = event . dataTransfer
1917 if ( ! transfer ) return
20-
2118 if ( hasFile ( transfer ) ) return
2219
23- const table = hasTable ( transfer )
24- if ( ! table ) return
20+ const textToPaste = generateText ( transfer )
21+ if ( ! textToPaste ) return
2522
2623 event . stopPropagation ( )
2724 event . preventDefault ( )
2825
2926 const field = event . currentTarget
3027 if ( field instanceof HTMLTextAreaElement ) {
31- insertText ( field , tableMarkdown ( table ) )
28+ insertText ( field , textToPaste )
3229 }
3330}
3431
@@ -40,15 +37,15 @@ function onDragover(event: DragEvent) {
4037function onPaste ( event : ClipboardEvent ) {
4138 if ( ! event . clipboardData ) return
4239
43- const table = hasTable ( event . clipboardData )
44- if ( ! table ) return
40+ const textToPaste = generateText ( event . clipboardData )
41+ if ( ! textToPaste ) return
4542
4643 event . stopPropagation ( )
4744 event . preventDefault ( )
4845
4946 const field = event . currentTarget
5047 if ( field instanceof HTMLTextAreaElement ) {
51- insertText ( field , tableMarkdown ( table ) )
48+ insertText ( field , textToPaste )
5249 }
5350}
5451
@@ -84,18 +81,19 @@ function tableMarkdown(node: Element): string {
8481 return `\n${ header } ${ body } \n\n`
8582}
8683
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+
8890 const el = document . createElement ( 'div' )
8991 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
9595
96- const html = transfer . getData ( 'text/html' )
97- if ( ! / < t a b l e / i. test ( html ) ) return null
96+ const formattedTable = tableMarkdown ( table )
9897
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 } ` )
10199}
0 commit comments