diff --git a/src/mathquill.d.ts b/src/mathquill.d.ts index f68dfa358..904ba675e 100644 --- a/src/mathquill.d.ts +++ b/src/mathquill.d.ts @@ -122,9 +122,9 @@ declare namespace MathQuill { statelessClipboard?: boolean; onPaste?: () => void; onCut?: () => void; - overridePaste?: (event?: ClipboardEvent) => void; - overrideCopy?: (event?: ClipboardEvent) => void; - overrideCut?: (event?: ClipboardEvent) => void; + overridePaste?: (event?: ClipboardEvent) => boolean; + overrideCopy?: (event?: ClipboardEvent) => boolean; + overrideCut?: (event?: ClipboardEvent) => boolean; overrideTypedText?: (text: string) => void; overrideKeystroke?: (key: string, event: KeyboardEvent) => void; autoOperatorNames?: string; diff --git a/src/publicapi.ts b/src/publicapi.ts index d623871f6..4464deb57 100644 --- a/src/publicapi.ts +++ b/src/publicapi.ts @@ -113,9 +113,9 @@ class Options { disableCopyPaste?: boolean; statelessClipboard?: boolean; logAriaAlerts?: boolean; - overridePaste?: (event?: ClipboardEvent) => void; - overrideCopy?: (event?: ClipboardEvent) => void; - overrideCut?: (event?: ClipboardEvent) => void; + overridePaste?: (event?: ClipboardEvent) => boolean; + overrideCopy?: (event?: ClipboardEvent) => boolean; + overrideCut?: (event?: ClipboardEvent) => boolean; onPaste?: () => void; onCut?: () => void; overrideTypedText?: (text: string) => void; diff --git a/src/services/saneKeyboardEvents.util.ts b/src/services/saneKeyboardEvents.util.ts index f2c9a5b27..54b736a29 100644 --- a/src/services/saneKeyboardEvents.util.ts +++ b/src/services/saneKeyboardEvents.util.ts @@ -350,8 +350,8 @@ var saneKeyboardEvents = (function () { const clipboardEvent = e instanceof ClipboardEvent ? e : undefined; if (clipboardEvent && controller.options?.overridePaste) { - controller.options.overridePaste(clipboardEvent); - return; + const earlyReturn = controller.options.overridePaste(clipboardEvent); + if (earlyReturn) return; } everyTick.listen(function pastedText() { @@ -366,6 +366,21 @@ var saneKeyboardEvents = (function () { everyTick.trigger(e); } + function updateClipboardData(e: ClipboardEvent | undefined) { + if (e?.clipboardData) { + const selection = controller.exportLatexSelection().selection; + if (selection.startIndex !== selection.endIndex) { + const text = selection.latex.slice( + selection.startIndex, + selection.endIndex + ); + e.clipboardData.setData('text/plain', text); + e.clipboardData.setData('application/x-latex', text); + e.preventDefault(); + } + } + } + if (controller.KIND_OF_MQ === 'StaticMath') { controller.addTextareaEventListeners({ keydown: (evt) => { @@ -406,9 +421,10 @@ var saneKeyboardEvents = (function () { const clipboardEvent = evt instanceof ClipboardEvent ? evt : undefined; if (clipboardEvent && controller.options?.overrideCut) { - controller.options.overrideCut(clipboardEvent); - return; + const earlyReturn = controller.options.overrideCut(clipboardEvent); + if (earlyReturn) return; } + updateClipboardData(clipboardEvent); everyTick.listenOnce(function () { controller.cut(); }); @@ -417,12 +433,10 @@ var saneKeyboardEvents = (function () { const clipboardEvent = evt instanceof ClipboardEvent ? evt : undefined; if (clipboardEvent && controller.options?.overrideCopy) { - controller.options.overrideCopy(clipboardEvent); - return; + const earlyReturn = controller.options.overrideCopy(clipboardEvent); + if (earlyReturn) return; } - everyTick.listenOnce(function () { - controller.copy(); - }); + updateClipboardData(clipboardEvent); }, paste: onPaste, input: onInput