textualize/frontend/useCases/createDiffEditorInteractions.ts
2023-02-08 22:43:18 -06:00

76 lines
2.2 KiB
TypeScript

import * as monaco from 'monaco-editor/esm/vs/editor/editor.api'
export enum MarkdownOperator {
H1 = '# ',
H2 = '## ',
H3 = '### ',
H4 = '#### ',
ITALLICS = '__',
BOLD = '**',
BULLET = '* ',
}
const wrapperOperators = [
MarkdownOperator.ITALLICS,
MarkdownOperator.BOLD
]
const createDiffEditorInteractions = (editor: monaco.editor.IStandaloneDiffEditor)=> {
const modifiedEditor = editor.getModifiedEditor()
const originalEditor = editor.getOriginalEditor()
return {
undo: () => { },
redo: () => { },
insertMarkdownOperator: (operator: MarkdownOperator) => {
const selection = modifiedEditor.getSelection()
if (!selection) return
const { startColumn, startLineNumber, endColumn, endLineNumber } = selection
const doesSelectionHaveRange = (endLineNumber > startLineNumber) || (endColumn > startColumn)
const lineOfCursor = startLineNumber
const lengthOfLine = (modifiedEditor.getModel()?.getLineLength(lineOfCursor) || 1) + 1
let range: monaco.IRange = { startColumn, startLineNumber, endColumn, endLineNumber, }
let newText = modifiedEditor.getModel()?.getValueInRange(range) || ''
if (wrapperOperators.includes(operator)) {
if (!doesSelectionHaveRange) {
range = {
startLineNumber: lineOfCursor,
endLineNumber: lineOfCursor,
startColumn: 0,
endColumn: lengthOfLine
}
}
newText = `${operator}${modifiedEditor.getModel()?.getValueInRange(range)}${operator}`
} else {
const wordAtStartPosition = modifiedEditor.getModel()?.getWordAtPosition({
column:startColumn, lineNumber: startLineNumber
})
if (!doesSelectionHaveRange && wordAtStartPosition) {
range = {
startLineNumber,
startColumn: wordAtStartPosition.startColumn,
endLineNumber,
endColumn: wordAtStartPosition.endColumn
}
}
newText = `${operator}${modifiedEditor.getModel()?.getValueInRange(range)}`
}
modifiedEditor.executeEdits('editor', [{
range,
text: newText
}])
}
}
}
export default createDiffEditorInteractions