1
0
mirror of https://github.com/BoostIo/Boostnote synced 2025-12-13 17:56:25 +00:00

added text expansion support

This commit is contained in:
Hung Nguyen
2018-04-18 19:31:10 +07:00
parent f4024f4683
commit 2e9b478824

View File

@@ -94,6 +94,18 @@ export default class CodeEditor extends React.Component {
componentDidMount () { componentDidMount () {
const { rulers, enableRulers } = this.props const { rulers, enableRulers } = this.props
const storagePath = findStorage(this.props.storageKey).path
const expandDataFile = path.join(storagePath, 'expandData.json')
if (!fs.existsSync(expandDataFile)) {
const defaultExpandData = [
{
matches: ['expandme'],
content: 'Here I am'
}
];
fs.writeFileSync(expandDataFile, JSON.stringify(defaultExpandData), 'utf8')
}
const expandData = JSON.parse(fs.readFileSync(expandDataFile, 'utf8'))
this.value = this.props.value this.value = this.props.value
this.editor = CodeMirror(this.refs.root, { this.editor = CodeMirror(this.refs.root, {
@@ -116,6 +128,8 @@ export default class CodeEditor extends React.Component {
Tab: function (cm) { Tab: function (cm) {
const cursor = cm.getCursor() const cursor = cm.getCursor()
const line = cm.getLine(cursor.line) const line = cm.getLine(cursor.line)
const cursorPosition = cursor.ch
const charBeforeCursor = line.substr(cursorPosition - 1, 1)
if (cm.somethingSelected()) cm.indentSelection('add') if (cm.somethingSelected()) cm.indentSelection('add')
else { else {
const tabs = cm.getOption('indentWithTabs') const tabs = cm.getOption('indentWithTabs')
@@ -127,6 +141,66 @@ export default class CodeEditor extends React.Component {
cm.execCommand('insertSoftTab') cm.execCommand('insertSoftTab')
} }
cm.execCommand('goLineEnd') cm.execCommand('goLineEnd')
} else if (charBeforeCursor !== ' ') {
// text expansion on tab key
let tempCursorPosition = cursorPosition;
let wordBeforeCursor = '';
const emptyChars = /\t|\s|\r|\n/
// to prevent the word to expand is long that will crash the whole app
// the safeStop is there to stop user to expand words that longer than 20 chars
const safeStop = 20;
while (tempCursorPosition > 0) {
let currentChar = line.substr(tempCursorPosition - 1, 1);
// if char is not an empty char
if (!emptyChars.test(currentChar)) {
wordBeforeCursor = currentChar + wordBeforeCursor
} else if (wordBeforeCursor.length >= safeStop) {
throw new Error("Your text expansion word is too long !")
} else {
break
}
tempCursorPosition--;
}
for (let i = 0; i < expandData.length; i++) {
if (Array.isArray(expandData[i].matches)) {
if (expandData[i].matches.indexOf(wordBeforeCursor) !== -1) {
let range = {
from: {line: cursor.line, ch: cursor.ch},
to: {line: cursor.line, ch: tempCursorPosition}
}
cm.replaceRange(
expandData[i].content,
range.from,
range.to
)
return // stop if text is expanded
}
}
else if (typeof(expandData[i].matches) === 'string') {
if (expandData[i].matches === wordBeforeCursor) {
let range = {
from: {line: cursor.line, ch: cursor.ch},
to: {line: cursor.line, ch: tempCursorPosition}
}
cm.replaceRange(
expandData[i].content,
range.from,
range.to
)
return // stop if text is expanded
}
}
}
if (tabs) {
cm.execCommand('insertTab')
} else {
cm.execCommand('insertSoftTab')
}
} else { } else {
if (tabs) { if (tabs) {
cm.execCommand('insertTab') cm.execCommand('insertTab')