Skip to content

Commit d7d3426

Browse files
authored
Merge pull request #2 from github/safari-paste-fixes
Fix pasting a single link in Safari
2 parents 52cb260 + 8fbaca5 commit d7d3426

2 files changed

Lines changed: 20 additions & 20 deletions

File tree

src/paste-markdown-image-link.js

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,15 @@ function onDrop(event: DragEvent) {
2121
if (hasFile(transfer)) return
2222
if (!hasLink(transfer)) return
2323

24+
const links = extractLinks(transfer)
25+
if (!links.some(isImageLink)) return
26+
2427
event.stopPropagation()
2528
event.preventDefault()
2629

2730
const field = event.currentTarget
2831
if (!(field instanceof HTMLTextAreaElement)) return
29-
30-
for (const link of links(transfer).map(linkify)) {
31-
insertText(field, link)
32-
}
32+
insertText(field, links.map(linkify).join(''))
3333
}
3434

3535
function onDragover(event: DragEvent) {
@@ -41,14 +41,15 @@ function onPaste(event: ClipboardEvent) {
4141
const transfer = event.clipboardData
4242
if (!transfer || !hasLink(transfer)) return
4343

44+
const links = extractLinks(transfer)
45+
if (!links.some(isImageLink)) return
46+
4447
event.stopPropagation()
4548
event.preventDefault()
4649

4750
const field = event.currentTarget
4851
if (!(field instanceof HTMLTextAreaElement)) return
49-
for (const link of links(transfer).map(linkify)) {
50-
insertText(field, link)
51-
}
52+
insertText(field, links.map(linkify).join(''))
5253
}
5354

5455
function linkify(link: string): string {
@@ -63,14 +64,12 @@ function hasLink(transfer: DataTransfer): boolean {
6364
return Array.from(transfer.types).indexOf('text/uri-list') >= 0
6465
}
6566

66-
function links(transfer: DataTransfer): Array<string> {
67+
function extractLinks(transfer: DataTransfer): Array<string> {
6768
return (transfer.getData('text/uri-list') || '').split('\r\n')
6869
}
6970

71+
const IMAGE_RE = /\.(gif|png|jpe?g)$/i
72+
7073
function isImageLink(url: string): boolean {
71-
const ext = url
72-
.split('.')
73-
.pop()
74-
.toLowerCase()
75-
return ['gif', 'png', 'jpg', 'jpeg'].indexOf(ext) > -1
74+
return IMAGE_RE.test(url)
7675
}

src/text.js

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
/* @flow strict */
22

33
export function insertText(textarea: HTMLInputElement | HTMLTextAreaElement, text: string): void {
4-
const point = textarea.selectionEnd
5-
const beginning = textarea.value.substring(0, point)
6-
const remaining = textarea.value.substring(point)
7-
const newline = textarea.value === '' || beginning.match(/\n$/) ? '' : '\n'
4+
const beginning = textarea.value.substring(0, textarea.selectionStart)
5+
const remaining = textarea.value.substring(textarea.selectionEnd)
86

9-
textarea.value = beginning + newline + text + remaining
10-
textarea.selectionStart = point + text.length
11-
textarea.selectionEnd = point + text.length
7+
const newline = beginning.length === 0 || beginning.match(/\n$/) ? '' : '\n'
8+
const textBeforeCursor = beginning + newline + text
9+
10+
textarea.value = textBeforeCursor + remaining
11+
textarea.selectionStart = textBeforeCursor.length
12+
textarea.selectionEnd = textarea.selectionStart
1213

1314
textarea.dispatchEvent(
1415
new CustomEvent('change', {

0 commit comments

Comments
 (0)