Skip to content

Commit 89fa5ba

Browse files
committed
Retain text around tables
1 parent 28f0e37 commit 89fa5ba

File tree

1 file changed

+17
-26
lines changed

1 file changed

+17
-26
lines changed

src/paste-markdown-table.ts

Lines changed: 17 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,17 @@ export function uninstall(el: HTMLElement): void {
1515
function onDrop(event: DragEvent) {
1616
const transfer = event.dataTransfer
1717
if (!transfer) return
18-
1918
if (hasFile(transfer)) return
2019

21-
const table = getTable(transfer)
22-
if (!table) return
20+
const textToPaste = generateText(transfer)
21+
if (!textToPaste) return
2322

2423
event.stopPropagation()
2524
event.preventDefault()
2625

2726
const field = event.currentTarget
2827
if (field instanceof HTMLTextAreaElement) {
29-
insertText(field, tableMarkdown(table))
28+
insertText(field, textToPaste)
3029
}
3130
}
3231

@@ -38,15 +37,15 @@ function onDragover(event: DragEvent) {
3837
function onPaste(event: ClipboardEvent) {
3938
if (!event.clipboardData) return
4039

41-
const table = getTable(event.clipboardData)
42-
if (!table) return
40+
const textToPaste = generateText(event.clipboardData)
41+
if (!textToPaste) return
4342

4443
event.stopPropagation()
4544
event.preventDefault()
4645

4746
const field = event.currentTarget
4847
if (field instanceof HTMLTextAreaElement) {
49-
insertText(field, tableMarkdown(table))
48+
insertText(field, textToPaste)
5049
}
5150
}
5251

@@ -82,27 +81,19 @@ function tableMarkdown(node: Element): string {
8281
return `\n${header}${body}\n\n`
8382
}
8483

85-
function parseTable(html: string): HTMLElement | null {
86-
const el = document.createElement('div')
87-
el.innerHTML = html
88-
89-
const table = el.querySelector('table')
90-
table?.remove()
91-
92-
// Reject tables that have extra text around them.
93-
if (el?.textContent?.trim()) {
94-
return null
95-
}
84+
function generateText(transfer: DataTransfer): string | undefined {
85+
if (Array.from(transfer.types).indexOf('text/html') === -1) return
9686

97-
return table
98-
}
87+
const html = transfer.getData('text/html')
88+
if (!/<table/i.test(html)) return
9989

100-
function getTable(transfer: DataTransfer): HTMLElement | null {
101-
if (Array.from(transfer.types).indexOf('text/html') === -1) return null
90+
const el = document.createElement('div')
91+
el.innerHTML = html
92+
let table = el.querySelector('table')
93+
table = !table || table.closest('[data-paste-markdown-skip]') ? null : table
94+
if (!table) return
10295

103-
const html = transfer.getData('text/html')
104-
if (!/<table/i.test(html)) return null
96+
const formattedTable = tableMarkdown(table)
10597

106-
const table = parseTable(html)
107-
return !table || table.closest('[data-paste-markdown-skip]') ? null : table
98+
return html.replace(/<meta.*?>/, '').replace(/<table.*<\/table>/, `\n${formattedTable}`)
10899
}

0 commit comments

Comments
 (0)