utils.ts47 lines · main
| 1 | import type { editor as monacoEditor } from 'monaco-editor' |
| 2 | |
| 3 | export type EditorSelection = { |
| 4 | selection: string |
| 5 | beforeSelection: string |
| 6 | afterSelection: string |
| 7 | startLineNumber: number |
| 8 | endLineNumber: number |
| 9 | } |
| 10 | |
| 11 | export function getEditorSelectionParts( |
| 12 | editor: monacoEditor.IStandaloneCodeEditor |
| 13 | ): EditorSelection | null { |
| 14 | const selection = editor.getSelection() |
| 15 | const model = editor.getModel() |
| 16 | if (!model || !selection) return null |
| 17 | |
| 18 | const allLines = model.getLinesContent() |
| 19 | |
| 20 | const noSelection = |
| 21 | selection.startLineNumber === selection.endLineNumber && |
| 22 | selection.startColumn === selection.endColumn |
| 23 | |
| 24 | if (noSelection) { |
| 25 | return { |
| 26 | selection: allLines.join('\n'), |
| 27 | beforeSelection: '', |
| 28 | afterSelection: '', |
| 29 | startLineNumber: selection.startLineNumber, |
| 30 | endLineNumber: selection.endLineNumber, |
| 31 | } |
| 32 | } |
| 33 | |
| 34 | const startLineIndex = selection.startLineNumber - 1 |
| 35 | const endLineIndex = selection.endLineNumber |
| 36 | |
| 37 | const beforeLines = allLines.slice(0, startLineIndex) |
| 38 | const afterLines = allLines.slice(endLineIndex) |
| 39 | |
| 40 | return { |
| 41 | selection: allLines.slice(startLineIndex, endLineIndex).join('\n'), |
| 42 | beforeSelection: beforeLines.length > 0 ? beforeLines.join('\n') + '\n' : '', |
| 43 | afterSelection: afterLines.length > 0 ? '\n' + afterLines.join('\n') : '', |
| 44 | startLineNumber: selection.startLineNumber, |
| 45 | endLineNumber: selection.endLineNumber, |
| 46 | } |
| 47 | } |