You've already forked joplin
mirror of
https://github.com/laurent22/joplin.git
synced 2026-04-24 19:55:13 +02:00
48 lines
1.2 KiB
TypeScript
48 lines
1.2 KiB
TypeScript
import { isolateHistory } from '@codemirror/commands';
|
|
import { Command } from '@codemirror/view';
|
|
|
|
export enum ClipboardAction {
|
|
Cut = 'cut',
|
|
Copy = 'copy',
|
|
}
|
|
|
|
type OnWriteClipboard = (text: string)=> void;
|
|
const cutOrCopyText = (onWriteClipboard: OnWriteClipboard, action: ClipboardAction): Command => (view) => {
|
|
const state = view.state;
|
|
const selections = state.selection.ranges.map(range => (
|
|
state.sliceDoc(range.from, range.to)
|
|
));
|
|
const nonEmptySelections = selections.filter(s => !!s);
|
|
|
|
const cutTransactions = [];
|
|
if (nonEmptySelections.length > 0) {
|
|
onWriteClipboard(nonEmptySelections.join('\n'));
|
|
|
|
cutTransactions.push(state.replaceSelection(''));
|
|
} else {
|
|
const selectedLine = state.doc.lineAt(state.selection.main.anchor);
|
|
onWriteClipboard(`${selectedLine.text}\n`);
|
|
|
|
cutTransactions.push({
|
|
changes: [{
|
|
from: selectedLine.from,
|
|
to: Math.min(selectedLine.to + 1, state.doc.length),
|
|
insert: '',
|
|
}],
|
|
});
|
|
}
|
|
|
|
cutTransactions.push({
|
|
annotations: [isolateHistory.of('full')],
|
|
userEvent: 'delete.cut',
|
|
});
|
|
|
|
if (action === ClipboardAction.Cut) {
|
|
view.dispatch(...cutTransactions);
|
|
}
|
|
|
|
return true;
|
|
};
|
|
|
|
export default cutOrCopyText;
|