|
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; |
|
} |
|
}); |
|
} |
|
|