| import { power_user } from './power-user.js'; |
|
|
| export function initInputMarkdown() { |
| $(document).on('keydown', 'textarea.mdHotkeys', function (e) { |
| if (!power_user.enable_md_hotkeys) { return; } |
|
|
| |
| let textarea = this; |
| if (!(textarea instanceof HTMLTextAreaElement)) { |
| return; |
| } |
|
|
| |
| if (e.key === 'Control' || !e.ctrlKey || e.altKey || e.metaKey || (e.shiftKey && !(e.ctrlKey && e.shiftKey && e.code === 'Backquote'))) { |
| return; |
| } |
| let charsToAdd = ''; |
| let possiblePreviousFormattingMargin = 1; |
|
|
| switch (true) { |
| case e.ctrlKey && e.shiftKey && e.code === 'Backquote': |
| e.preventDefault(); |
| e.stopPropagation(); |
| charsToAdd = '~~'; |
| possiblePreviousFormattingMargin = 2; |
| break; |
| case e.ctrlKey && e.code === 'KeyB': |
| e.preventDefault(); |
| e.stopPropagation(); |
| charsToAdd = '**'; |
| possiblePreviousFormattingMargin = 2; |
| break; |
| case e.ctrlKey && e.code === 'KeyI': |
| e.preventDefault(); |
| e.stopPropagation(); |
| charsToAdd = '*'; |
| break; |
| case e.ctrlKey && e.code === 'KeyU': |
| e.preventDefault(); |
| e.stopPropagation(); |
| charsToAdd = '__'; |
| possiblePreviousFormattingMargin = 2; |
| break; |
| case e.ctrlKey && e.code === 'KeyK': |
| e.preventDefault(); |
| e.stopPropagation(); |
| charsToAdd = '`'; |
| break; |
| default: |
| return; |
| } |
|
|
| let selectedText = ''; |
| let start = textarea.selectionStart; |
| let end = textarea.selectionEnd; |
| let beforeCaret = textarea.value.substring(start - 1, start); |
| let afterCaret = textarea.value.substring(end, end + 1); |
| let isTextSelected = (start !== end); |
| let cursorShift = charsToAdd.length; |
| let selectedTextandPossibleFormatting = textarea.value.substring(start - possiblePreviousFormattingMargin, end + possiblePreviousFormattingMargin).trim(); |
|
|
| if (isTextSelected) { |
| selectedText = textarea.value.substring(start, end); |
| if (selectedTextandPossibleFormatting === charsToAdd + selectedText + charsToAdd) { |
| |
|
|
| let expandedStart = start - charsToAdd.length; |
| let expandedEnd = end + charsToAdd.length; |
|
|
| |
| if (expandedStart < 0) expandedStart = 0; |
| if (expandedEnd > textarea.value.length) expandedEnd = textarea.value.length; |
|
|
| |
| textarea.setSelectionRange(expandedStart, expandedEnd); |
|
|
| |
| document.execCommand('insertText', false, selectedText); |
| |
| cursorShift = -charsToAdd.length; |
| } else { |
| |
| let possibleAddedSpace = ''; |
| if (selectedText.endsWith(' ')) { |
| possibleAddedSpace = ' '; |
| selectedText = selectedText.substring(0, selectedText.length - 1); |
| end--; |
| } |
| |
| textarea.focus(); |
| document.execCommand('insertText', false, charsToAdd + selectedText + charsToAdd + possibleAddedSpace); |
| } |
| } else { |
| |
|
|
| if (beforeCaret !== ' ' && afterCaret !== ' ' && afterCaret !== '' && beforeCaret !== '') { |
| |
| let midCaretExpandedStart = start - 1; |
| let midCaretExpandedEnd = end + 1; |
| while (midCaretExpandedStart > 0 && textarea.value.substring(midCaretExpandedStart - 1, midCaretExpandedStart) !== ' ') { |
| midCaretExpandedStart--; |
| } |
| while (midCaretExpandedEnd < textarea.value.length && textarea.value.substring(midCaretExpandedEnd, midCaretExpandedEnd + 1) !== ' ') { |
| midCaretExpandedEnd++; |
| } |
| |
| textarea.setSelectionRange(midCaretExpandedStart, midCaretExpandedEnd); |
| |
| let discoveredWordWithPossibleFormatting = textarea.value.substring(midCaretExpandedStart, midCaretExpandedEnd).trim(); |
| let discoveredWord = ''; |
|
|
| if (discoveredWordWithPossibleFormatting.endsWith(charsToAdd) && discoveredWordWithPossibleFormatting.startsWith(charsToAdd)) { |
| discoveredWord = textarea.value.substring(midCaretExpandedStart + charsToAdd.length, midCaretExpandedEnd - charsToAdd.length).trim(); |
| } else { |
| discoveredWord = textarea.value.substring(midCaretExpandedStart, midCaretExpandedEnd).trim(); |
| } |
|
|
| if (charsToAdd + discoveredWord + charsToAdd === discoveredWordWithPossibleFormatting) { |
|
|
| |
| textarea.focus(); |
| document.execCommand('insertText', false, discoveredWord); |
| |
| cursorShift = -charsToAdd.length; |
| } else { |
| textarea.focus(); |
| document.execCommand('insertText', false, charsToAdd + discoveredWord + charsToAdd); |
| } |
|
|
|
|
| } else { |
| textarea.focus(); |
| textarea.setSelectionRange(start, end); |
| selectedText = textarea.value.substring(start, end); |
| document.execCommand('insertText', false, charsToAdd + selectedText + charsToAdd); |
| } |
| } |
|
|
| |
| let event = new Event('input', { bubbles: true }); |
| textarea.dispatchEvent(event); |
|
|
| |
| if (isTextSelected) { |
| textarea.selectionStart = start + cursorShift; |
| textarea.selectionEnd = start + cursorShift + selectedText.length; |
| } else { |
| textarea.selectionStart = start + cursorShift; |
| textarea.selectionEnd = start + cursorShift; |
| } |
| }); |
| } |
|
|