UNPKG

@uiw/react-md-editor

Version:

A markdown editor with preview, implemented with React.js and TypeScript.

97 lines (81 loc) 2.99 kB
import { insertTextAtPosition } from '../../utils/InsertTextAtPosition'; import { TextAreaTextApi } from '../../commands'; import { insertBeforeEachLine } from '../../commands/list'; /** * - `13` - `Enter` * - `9` - `Tab` */ function stopPropagation(e) { e.stopPropagation(); e.preventDefault(); } export default function handleKeyDown(e, tabSize, defaultTabEnable) { if (tabSize === void 0) { tabSize = 2; } if (defaultTabEnable === void 0) { defaultTabEnable = false; } var target = e.target; var starVal = target.value.substr(0, target.selectionStart); var valArr = starVal.split('\n'); var currentLineStr = valArr[valArr.length - 1]; var textArea = new TextAreaTextApi(target); /** * `9` - `Tab` */ if (!defaultTabEnable && e.code && e.code.toLowerCase() === 'tab') { stopPropagation(e); var space = new Array(tabSize + 1).join(' '); if (target.selectionStart !== target.selectionEnd) { var _star = target.value.substring(0, target.selectionStart).split('\n'); var _end = target.value.substring(0, target.selectionEnd).split('\n'); var modifiedTextLine = []; _end.forEach((item, idx) => { if (item !== _star[idx]) { modifiedTextLine.push(item); } }); var modifiedText = modifiedTextLine.join('\n'); var oldSelectText = target.value.substring(target.selectionStart, target.selectionEnd); var newStarNum = target.value.substring(0, target.selectionStart).length; textArea.setSelectionRange({ start: target.value.indexOf(modifiedText), end: target.selectionEnd }); var modifiedTextObj = insertBeforeEachLine(modifiedText, e.shiftKey ? '' : space); var text = modifiedTextObj.modifiedText; if (e.shiftKey) { text = text.split('\n').map(item => item.replace(new RegExp("^" + space), '')).join('\n'); } textArea.replaceSelection(text); var startTabSize = e.shiftKey ? -tabSize : tabSize; var endTabSize = e.shiftKey ? -modifiedTextLine.length * tabSize : modifiedTextLine.length * tabSize; textArea.setSelectionRange({ start: newStarNum + startTabSize, end: newStarNum + oldSelectText.length + endTabSize }); } else { return insertTextAtPosition(target, space); } } else if (e.code && e.code.toLowerCase() === 'enter' && (/^(-|\*)\s/.test(currentLineStr) || /^\d+.\s/.test(currentLineStr))) { /** * `13` - `Enter` */ stopPropagation(e); var startStr = '\n- '; if (currentLineStr.startsWith('*')) { startStr = '\n* '; } if (currentLineStr.startsWith('- [ ]')) { startStr = '\n- [ ] '; } else if (currentLineStr.startsWith('- [X]')) { startStr = '\n- [X] '; } if (/^\d+.\s/.test(currentLineStr)) { startStr = "\n" + (parseInt(currentLineStr) + 1) + ". "; } return insertTextAtPosition(target, startStr); } } //# sourceMappingURL=handleKeyDown.js.map