codeblock intent handling

This commit is contained in:
rnwelsh 2022-06-09 02:34:42 -05:00
parent 45f22fc95e
commit efa2bf2b34
5 changed files with 30 additions and 13 deletions

1
.gitignore vendored
View File

@ -16,4 +16,3 @@ thumbs.db
.env
.eslintcache
marktext.code-workspace
**/*.NEW

1
.nvmrc Normal file
View File

@ -0,0 +1 @@
16.15.1

View File

@ -258,29 +258,42 @@ const backspaceCtrl = ContentState => {
return this.singleRender(startBlock)
}
// Fix: https://github.com/marktext/marktext/issues/2013
// Also fix the codeblock crashed when the code content is '\n' and press backspace.
if (
startBlock.functionType === 'codeContent' &&
startBlock.key === endBlock.key &&
this.cursor.start.offset === this.cursor.end.offset &&
(/\n.$/.test(startBlock.text) || startBlock.text === '\n') &&
startBlock.text.length === this.cursor.start.offset
!(this.cursor.start.offset === 0 && this.cursor.end.offset === 0)
) {
event.preventDefault()
event.stopPropagation()
startBlock.text = /\n.$/.test(startBlock.text) ? startBlock.text.replace(/.$/, '') : ''
const { key } = startBlock
const offset = startBlock.text.length
let offset
const startOffset = this.cursor.start.offset
const endOffset = this.cursor.end.offset
// Fix: https://github.com/marktext/marktext/issues/2013
// Also fix the codeblock crashed when the code content is '\n' and press backspace.
if (
startOffset === endOffset &&
(/\n.$/.test(startBlock.text) || startBlock.text === '\n') &&
startBlock.text.length === startOffset
) {
startBlock.text = /\n.$/.test(startBlock.text) ? startBlock.text.slice(0, -1) : ''
offset = startBlock.text.length
} else {
// backspace at tabwidth within a codeblock if no text highlighted
// and cursor is after a tabWidth of whitespace
const regexUnindent = new RegExp(`\n.*(${String.fromCharCode(32).repeat(this.tabSize)})$`)
const shouldUnindent = regexUnindent.test(startBlock.text.substring(0, startOffset))
const backspaceSize = (shouldUnindent) ? this.tabSize : 1
offset = (startOffset === endOffset) ? startOffset - backspaceSize : startOffset
startBlock.text = startBlock.text.substring(0, offset) +
startBlock.text.substring(endOffset)
}
this.cursor = {
start: { key, offset },
end: { key, offset }
}
return this.singleRender(startBlock)
}
// If select multiple paragraph or multiple characters in one paragraph, just let
// inputCtrl to handle this case.
if (start.key !== end.key || start.offset !== end.offset) {

View File

@ -9,6 +9,10 @@ const checkAutoIndent = (text, offset) => {
const pairStr = text.substring(offset - 1, offset + 1)
return /^(\{\}|\[\]|\(\)|><)$/.test(pairStr)
}
const getCodeblockIndentSpace = text => {
const match = /\n([ \t]*).*$/.exec(text)
return match ? match[1] : ''
}
const getIndentSpace = text => {
const match = /^(\s*)\S/.exec(text)
return match ? match[1] : ''
@ -271,7 +275,7 @@ const enterCtrl = ContentState => {
) {
const { text, key } = block
const autoIndent = checkAutoIndent(text, start.offset)
const indent = getIndentSpace(text)
const indent = getCodeblockIndentSpace(text.substring(1, start.offset))
block.text = text.substring(0, start.offset) +
'\n' +
(autoIndent ? indent + ' '.repeat(this.tabSize) + '\n' : '') +

View File

@ -189,7 +189,7 @@ const tabCtrl = ContentState => {
ContentState.prototype.insertTab = function () {
const tabSize = this.tabSize
const tabCharacter = String.fromCharCode(160).repeat(tabSize)
const tabCharacter = String.fromCharCode(32).repeat(tabSize)
const { start, end } = this.cursor
const startBlock = this.getBlock(start.key)
const endBlock = this.getBlock(end.key)