multranslate
Advanced tools
Comparing version 0.3.3 to 0.3.4
@@ -160,4 +160,5 @@ #!/usr/bin/env node | ||
const infoText = 'Ctrl+C: clear input, Ctrl+<A/D>: go to start or end, Ctrl+<Q/W/E/R>: copy to clipboard, Escape: exit' | ||
// ⬆/⬇: scroll output, ⬅/➡: input navigation, Ctrl+<⬅/➡>: fast navigation | ||
const infoText = 'Ctrl+C: clear input, Ctrl+<A/D>: go to start or end, Ctrl+<⬆/⬇>: scroll output, Ctrl+<Q/W/E/R>: copy to clipboard, Escape: exit' | ||
// Shift+<⬆/⬇> - scroll input, <⬅/➡/⬆/⬇>: input navigation, Ctrl+<⬅/➡>: fast navigation, Ctrl+Del: delete word before cursor | ||
// Enter: translate | ||
@@ -187,2 +188,4 @@ // Информация по навигации внизу формы | ||
// 12345678 - автоматический перенос слова, если в конце строки 8 (без учета пробела) и меньше символов после пробела | ||
// Класс для управления текстовым буфером и курсором | ||
@@ -281,3 +284,3 @@ class TextBuffer { | ||
// outputBox1.setContent(`${maxLines} ${maxChars} | ${viewLines} ${currentLine}`) | ||
// outputBox2.setContent(box.getScroll()) | ||
// outputBox2.setContent(`${box.getScroll()}`) | ||
// outputBox3.setContent(box.getScrollHeight()) | ||
@@ -354,2 +357,131 @@ // outputBox4.setContent(box.getScrollPerc()) | ||
} | ||
// Метод навигации вверх или вниз | ||
navigateUpDown(box,type) { | ||
const maxChars = box.width - 4 | ||
// Массив из строк | ||
const bufferLines = this.text.split('\r') | ||
// Массив из длинны всех строк | ||
let linesArray = [] | ||
// Зафиксировать длинну только реальных строк | ||
for (let line of bufferLines) { | ||
linesArray.push(line.length) | ||
} | ||
// Фиксируем длинну всех строк | ||
// for (let line of bufferLines) { | ||
// // Добавляем виртуальные строки | ||
// if (line.length > maxChars) { | ||
// // ВАРИАНТ 3 | ||
// // Стартовая позиция для среза | ||
// let startCount = 0 | ||
// // Конец строки для среза из максимальной длинны | ||
// let endCount = maxChars | ||
// // Узнаем длинну строк с учетом автопереноса | ||
// while (true) { | ||
// // Срез текущей строки | ||
// let count = line.slice(startCount, endCount) | ||
// // Если достигли конца всех строк (длинна всей строки минус начальная позиция текущего среза меньше длинны строки с учетом переноса), добавляем остаток и завершаем цикл | ||
// if ((line.length - startCount) < maxChars) { | ||
// linesArray.push(line.length - startCount) | ||
// outputBox3.setContent(`(${line.length} - ${startCount} - 9 (${line.length - maxChars - 9})) < ${maxChars-9}`) | ||
// break | ||
// } | ||
// // Если достигли конца строки для автопереноса, добавляем длинну строки целиком, обновляем начальную позицию и конец строки среза для проверки следующей строки | ||
// else if (endCount === maxChars-9) { | ||
// linesArray.push(maxChars - 1) // -1 из за смещения пробелом курсора | ||
// startCount = startCount + maxChars | ||
// endCount = endCount + maxChars | ||
// } | ||
// // Если последний символ в строке не является пробелом, увеличиваем счетчик конца среза текущей строки | ||
// else if (count[count.length-1] !== ' ') { | ||
// endCount-- | ||
// } | ||
// // Если последний символ в строке содержит пробел, то добавляем строку текущей длинны среза | ||
// else { | ||
// linesArray.push(count.length - 1) // -1 из за смещения пробелом курсора | ||
// startCount = startCount + count.length | ||
// endCount = endCount + maxChars | ||
// } | ||
// } | ||
// // // ВАРИАНТ 2 | ||
// // // Фиксируем количество виртуальных строк + последняя строка | ||
// // let viewCurrentLines = Math.floor(line.length / (maxChars)) + 1 | ||
// // // Массив из длинны строк | ||
// // let viewCurrentLinesArray = [...Array(viewCurrentLines).keys()] | ||
// // let count = line.length | ||
// // // Собираем длинну строк | ||
// // count = line.length | ||
// // for (let l of viewCurrentLinesArray) { | ||
// // if (count > maxChars) { | ||
// // linesArray.push(maxChars-1) | ||
// // count -= maxChars | ||
// // } | ||
// // else { | ||
// // linesArray.push(count) | ||
// // } | ||
// // } | ||
// } | ||
// else { | ||
// linesArray.push(line.length) | ||
// } | ||
// } | ||
// outputBox1.setContent(`${linesArray[0]}`) | ||
// outputBox2.setContent(`${linesArray[1]}`) | ||
// outputBox3.setContent(`${linesArray[2]}`) | ||
// outputBox4.setContent(`${linesArray[3]}`) | ||
// Счетчик начинается с длинны первой строки | ||
let charsArray = linesArray[0] | ||
let cursorLine = 1 | ||
let charToLine = 0 | ||
// Фиксируем на какой строке находится курсор | ||
for (let lineIndex in linesArray) { | ||
// Проверяем, что курсор находится в пределах текущей строки | ||
if (this.cursorPosition <= charsArray) { | ||
break | ||
} | ||
else { | ||
// Фиксируем позицию курсора в текущей строке | ||
charToLine = this.cursorPosition - charsArray - 1 | ||
// Увеличиваем длинну символов курсора на длинну символов следующей строки + длинна одного символа переноса строки | ||
charsArray += linesArray[parseInt(lineIndex) + 1] + 1 | ||
// Увеличиваем счетчик строки | ||
cursorLine++ | ||
} | ||
} | ||
let positionToLine | ||
if (type === 'up') { | ||
if (cursorLine > 1) { | ||
// Фиксируем позицию в строке выше | ||
if (linesArray[cursorLine-2] >= charToLine) { | ||
positionToLine = charToLine | ||
} else { | ||
positionToLine = linesArray[cursorLine-2] | ||
} | ||
const linesArraySlice = linesArray.slice(0, cursorLine-2) | ||
for (let l of linesArraySlice) { | ||
positionToLine = positionToLine + l + 1 | ||
} | ||
this.cursorPosition = positionToLine | ||
} | ||
} | ||
else if (type === 'down') { | ||
if (cursorLine < linesArray.length) { | ||
// Если первая строка, обновляем значение текущей позиции в строке | ||
if (cursorLine === 1) { | ||
charToLine = this.cursorPosition | ||
} | ||
// Фиксируем позицию в строке ниже | ||
if (linesArray[cursorLine] >= charToLine) { | ||
positionToLine = charToLine | ||
} | ||
else { | ||
positionToLine = linesArray[cursorLine] | ||
} | ||
const linesArraySlice = linesArray.slice(0, cursorLine) | ||
for (let l of linesArraySlice) { | ||
positionToLine = positionToLine + l + 1 | ||
} | ||
this.cursorPosition = positionToLine | ||
} | ||
} | ||
} | ||
// Метод отключения нативного курсора | ||
@@ -413,9 +545,16 @@ disableNativeCursor() { | ||
// Поднимаем поле ввода текста вверх для ручного скроллинга | ||
// else if (key.name === 'up') { | ||
// inputBox.scroll(-1) | ||
// } | ||
else if (key.name === 'up' && key.shift === true) { | ||
inputBox.scroll(-1) | ||
} | ||
// Опускаем поле ввода текста вниз | ||
// else if (key.name === 'down') { | ||
// inputBox.scroll(1) | ||
// } | ||
else if (key.name === 'down' && key.shift === true) { | ||
inputBox.scroll(1) | ||
} | ||
// Навигация курсора между строками | ||
else if (key.name === 'up') { | ||
buffer.navigateUpDown(inputBox,'up') | ||
} | ||
else if (key.name === 'down') { | ||
buffer.navigateUpDown(inputBox,'down') | ||
} | ||
// Удалить словосочетание перед курсором | ||
@@ -442,3 +581,2 @@ else if (key.name === 'delete' && key.ctrl === true) { | ||
} | ||
// Удалить символ после курсором | ||
@@ -452,2 +590,8 @@ else if (key.name === 'delete') { | ||
} | ||
// Переопределяем нажатие Enter, для добавления 4 пробелов в буффер | ||
else if (key.name === 'tab') { | ||
const newText = buffer.getText().slice(0, buffer.getCursorPosition()) + ' ' + buffer.getText().slice(buffer.getCursorPosition()) | ||
buffer.setCursorPosition(buffer.getCursorPosition() + 4) | ||
buffer.setText(newText) | ||
} | ||
// Переопределяем нажатие Enter, не добавляя дополнительный символ переноса строки | ||
@@ -467,21 +611,9 @@ else if (key.name === 'enter') { | ||
} | ||
// Фиксируем текущую позицию для ручного скроллинга | ||
let currentScrollIndex = inputBox.getScroll() | ||
// Обновляем поле ввода текста | ||
inputBox.setValue(buffer.viewDisplayCursor()) | ||
// Включить ручной скроллинг | ||
// if (key.name !== 'up' && key.name !== 'down') { | ||
// // Если это не скролл вручную, скролим назад к текущей позиции после обновления текста | ||
// inputBox.scrollTo(currentScrollIndex) | ||
// // Если длина буфера и положение курсора совпадают, скролим в самый низ | ||
// if (buffer.getText().length === buffer.getCursorPosition()) { | ||
// inputBox.setScrollPerc(100) | ||
// } | ||
// // Если курсор в самом начале буфера, поднимаем в самый вверх | ||
// else if (buffer.getCursorPosition() === 0) { | ||
// inputBox.setScrollPerc(1) | ||
// } | ||
// } | ||
// Включить автоматический скроллинг | ||
buffer.navigateScroll(inputBox) | ||
// Добавить ручной скроллинг | ||
if (!((key.name === 'up' && key.shift === true) || (key.name === 'down' && key.shift === true))) { | ||
// Обновляем поле ввода текста | ||
inputBox.setValue(buffer.viewDisplayCursor()) | ||
// Включить автоматический скроллинг | ||
buffer.navigateScroll(inputBox) | ||
} | ||
screen.render() | ||
@@ -751,7 +883,6 @@ }) | ||
// Обработчик событий клавиш для пролистывания экрана панелей вывода: <Up/Down> или Ctrl+<Up/Down> | ||
// inputBox.key(['C-up', 'C-down'], function(ch, key) { | ||
inputBox.key(['up', 'down'], function(ch, key) { | ||
// Обработчик событий клавиш для пролистывания экрана панелей вывода: Ctrl+<Up/Down> | ||
inputBox.key(['C-up', 'C-down'], function(ch, key) { | ||
// Скроллим вверх | ||
if (key.name === 'up') { | ||
if (key.name === 'up' && key.ctrl == true) { | ||
outputBox1.scroll(-1) | ||
@@ -763,3 +894,3 @@ outputBox2.scroll(-1) | ||
// Скроллим вниз | ||
else if (key.name === 'down') { | ||
else if (key.name === 'down' && key.ctrl == true) { | ||
outputBox1.scroll(1) | ||
@@ -766,0 +897,0 @@ outputBox2.scroll(1) |
{ | ||
"name": "multranslate", | ||
"version": "0.3.3", | ||
"version": "0.3.4", | ||
"description": "Cross-platform TUI for translating text using multiple providers simultaneously and support automatic detection of the source and destination language", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
445725
1522