Skip to content

Commit bc23e01

Browse files
adding new handler for keyboard shortcut paste
1 parent 9cbea84 commit bc23e01

File tree

6 files changed

+44
-1
lines changed

6 files changed

+44
-1
lines changed

src/handlers.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
const unformatted = new WeakMap<HTMLElement, boolean>()
2+
3+
export function handleUnformatted(event: KeyboardEvent): void {
4+
const {currentTarget: el} = event
5+
if (event.code === 'KeyV' && (event.ctrlKey || event.metaKey) && event.shiftKey) {
6+
unformatted.set(el as HTMLElement, true)
7+
}
8+
}
9+
10+
export function isUnformatted(el: HTMLElement): boolean {
11+
const isUnformattedState = unformatted.get(el) ?? false
12+
unformatted.delete(el)
13+
14+
return isUnformattedState
15+
}

src/paste-markdown-html.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
1+
import {handleUnformatted, isUnformatted} from './handlers'
12
import {insertText} from './text'
23

34
export function install(el: HTMLElement): void {
5+
el.addEventListener('keydown', handleUnformatted)
46
el.addEventListener('paste', onPaste)
57
}
68

79
export function uninstall(el: HTMLElement): void {
10+
el.removeEventListener('keydown', handleUnformatted)
811
el.removeEventListener('paste', onPaste)
912
}
1013

1114
function onPaste(event: ClipboardEvent) {
1215
const transfer = event.clipboardData
16+
const {currentTarget: el} = event
17+
if (isUnformatted(el as HTMLElement)) return
1318
// if there is no clipboard data, or
1419
// if there is no html content in the clipboard, return
1520
if (!transfer || !hasHTML(transfer)) return

src/paste-markdown-image-link.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
/* @flow strict */
2-
2+
import {handleUnformatted, isUnformatted} from './handlers'
33
import {insertText} from './text'
44

55
export function install(el: HTMLElement): void {
6+
el.addEventListener('keydown', handleUnformatted)
67
el.addEventListener('dragover', onDragover)
78
el.addEventListener('drop', onDrop)
89
el.addEventListener('paste', onPaste)
910
}
1011

1112
export function uninstall(el: HTMLElement): void {
13+
el.removeEventListener('keydown', handleUnformatted)
1214
el.removeEventListener('dragover', onDragover)
1315
el.removeEventListener('drop', onDrop)
1416
el.removeEventListener('paste', onPaste)
@@ -38,6 +40,9 @@ function onDragover(event: DragEvent) {
3840
}
3941

4042
function onPaste(event: ClipboardEvent) {
43+
const {currentTarget: el} = event
44+
if (isUnformatted(el as HTMLElement)) return
45+
4146
const transfer = event.clipboardData
4247
if (!transfer || !hasLink(transfer)) return
4348

src/paste-markdown-link.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
1+
import {handleUnformatted, isUnformatted} from './handlers'
12
import {insertText} from './text'
23

34
export function install(el: HTMLElement): void {
5+
el.addEventListener('keydown', handleUnformatted)
46
el.addEventListener('paste', onPaste)
57
}
68

79
export function uninstall(el: HTMLElement): void {
10+
el.removeEventListener('keydown', handleUnformatted)
811
el.removeEventListener('paste', onPaste)
912
}
1013

1114
function onPaste(event: ClipboardEvent) {
15+
const {currentTarget: el} = event
16+
if (isUnformatted(el as HTMLElement)) return
17+
1218
const transfer = event.clipboardData
1319
if (!transfer || !hasPlainText(transfer)) return
1420

src/paste-markdown-table.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
1+
import {handleUnformatted, isUnformatted} from './handlers'
12
import {insertText} from './text'
23

34
export function install(el: HTMLElement): void {
5+
el.addEventListener('keydown', handleUnformatted)
46
el.addEventListener('dragover', onDragover)
57
el.addEventListener('drop', onDrop)
68
el.addEventListener('paste', onPaste)
79
}
810

911
export function uninstall(el: HTMLElement): void {
12+
el.removeEventListener('keydown', handleUnformatted)
1013
el.removeEventListener('dragover', onDragover)
1114
el.removeEventListener('drop', onDrop)
1215
el.removeEventListener('paste', onPaste)
@@ -35,6 +38,9 @@ function onDragover(event: DragEvent) {
3538
}
3639

3740
function onPaste(event: ClipboardEvent) {
41+
const {currentTarget: el} = event
42+
if (isUnformatted(el as HTMLElement)) return
43+
3844
if (!event.clipboardData) return
3945

4046
const textToPaste = generateText(event.clipboardData)

src/paste-markdown-text.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
1+
import {handleUnformatted, isUnformatted} from './handlers'
12
import {insertText} from './text'
23

34
export function install(el: HTMLElement): void {
5+
el.addEventListener('keydown', handleUnformatted)
46
el.addEventListener('paste', onPaste)
57
}
68

79
export function uninstall(el: HTMLElement): void {
10+
el.removeEventListener('keydown', handleUnformatted)
811
el.removeEventListener('paste', onPaste)
912
}
1013

1114
function onPaste(event: ClipboardEvent) {
15+
const {currentTarget: el} = event
16+
if (isUnformatted(el as HTMLElement)) return
17+
1218
const transfer = event.clipboardData
1319
if (!transfer || !hasMarkdown(transfer)) return
1420

0 commit comments

Comments
 (0)